Create a ppt on hyponatremia by referring Harrison and Davidson medicine textbook
mkdir -p /tmp/workspace/hyponatremia-ppt && ls /tmp/workspace/hyponatremia-ppt/
~/hyponatremia-ppt/create_ppt.py
from pptx import Presentation
from pptx.util import Inches, Pt, Emu
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
from pptx.util import Inches, Pt
from io import BytesIO
# Color palette
DARK_BLUE = RGBColor(0x0D, 0x2B, 0x55) # deep navy
MED_BLUE = RGBColor(0x1A, 0x5C, 0x9A) # medium blue
ACCENT = RGBColor(0x00, 0xA8, 0xCC) # teal accent
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
LIGHT_BG = RGBColor(0xF0, 0xF5, 0xFA) # very light blue
TEXT_DARK = RGBColor(0x1A, 0x1A, 0x2E)
TEXT_GREY = RGBColor(0x44, 0x55, 0x66)
ORANGE = RGBColor(0xE8, 0x6A, 0x10)
GREEN = RGBColor(0x0B, 0x7A, 0x4B)
RED = RGBColor(0xC0, 0x39, 0x2B)
YELLOW_BG = RGBColor(0xFF, 0xF3, 0xCD)
PEACH = RGBColor(0xFD, 0xED, 0xED)
GREENL = RGBColor(0xE8, 0xF8, 0xF0)
BLUEL = RGBColor(0xE8, 0xF4, 0xFF)
prs = Presentation()
prs.slide_width = Inches(13.333)
prs.slide_height = Inches(7.5)
blank = prs.slide_layouts[6]
def add_rect(slide, x, y, w, h, fill_rgb=None, line_rgb=None, line_width=None):
from pptx.util import Pt
shape = slide.shapes.add_shape(1, Inches(x), Inches(y), Inches(w), Inches(h))
if fill_rgb:
shape.fill.solid()
shape.fill.fore_color.rgb = fill_rgb
else:
shape.fill.background()
if line_rgb:
shape.line.color.rgb = line_rgb
if line_width:
shape.line.width = Pt(line_width)
else:
shape.line.fill.background()
return shape
def add_text(slide, text, x, y, w, h, font_size=14, bold=False, color=TEXT_DARK,
align=PP_ALIGN.LEFT, italic=False, wrap=True, anchor=MSO_ANCHOR.TOP):
tb = slide.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h))
tf = tb.text_frame
tf.word_wrap = wrap
tf.vertical_anchor = anchor
tf.margin_left = Inches(0.05)
tf.margin_right = Inches(0.05)
tf.margin_top = Inches(0.03)
tf.margin_bottom = Inches(0.03)
p = tf.paragraphs[0]
p.alignment = align
run = p.add_run()
run.text = text
run.font.size = Pt(font_size)
run.font.bold = bold
run.font.italic = italic
run.font.color.rgb = color
run.font.name = "Calibri"
return tb
def add_multi_bullet(slide, items, x, y, w, h, font_size=13, color=TEXT_DARK,
bold_first=False, indent=False, line_spacing=None):
tb = slide.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h))
tf = tb.text_frame
tf.word_wrap = True
tf.margin_left = Inches(0.05)
tf.margin_right = Inches(0.05)
tf.margin_top = Inches(0.05)
tf.margin_bottom = Inches(0.05)
from pptx.oxml.ns import qn
from lxml import etree
for i, item in enumerate(items):
if i == 0:
p = tf.paragraphs[0]
else:
p = tf.add_paragraph()
p.alignment = PP_ALIGN.LEFT
if line_spacing:
p.line_spacing = Pt(line_spacing)
run = p.add_run()
run.text = item
run.font.size = Pt(font_size)
run.font.color.rgb = color
run.font.name = "Calibri"
if bold_first and i == 0:
run.font.bold = True
if indent:
p.level = 1
return tb
# ─────────────────────────────────────────────────────────────────
# SLIDE 1 — TITLE
# ─────────────────────────────────────────────────────────────────
slide = prs.slides.add_slide(blank)
# Full dark background
add_rect(slide, 0, 0, 13.333, 7.5, fill_rgb=DARK_BLUE)
# Accent bar
add_rect(slide, 0, 5.8, 13.333, 0.12, fill_rgb=ACCENT)
# Bottom strip
add_rect(slide, 0, 5.92, 13.333, 1.58, fill_rgb=MED_BLUE)
# Main title
add_text(slide, "HYPONATREMIA", 1, 1.5, 11.333, 1.5,
font_size=52, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
# Subtitle
add_text(slide, "Pathophysiology, Diagnosis & Management",
1, 3.1, 11.333, 0.7,
font_size=22, bold=False, color=ACCENT, align=PP_ALIGN.CENTER, italic=True)
# Sub-subtitle
add_text(slide, "Based on Harrison's Principles of Internal Medicine, 22nd Ed. (2025) & Davidson's Principles & Practice of Medicine",
1, 3.85, 11.333, 0.6,
font_size=12, bold=False, color=RGBColor(0xAA, 0xCC, 0xEE), align=PP_ALIGN.CENTER)
# Bottom text
add_text(slide, "Department of Internal Medicine | Clinical Presentation", 1, 6.2, 11.333, 0.5,
font_size=13, bold=False, color=WHITE, align=PP_ALIGN.CENTER)
# ─────────────────────────────────────────────────────────────────
# SLIDE 2 — DEFINITION & OVERVIEW
# ─────────────────────────────────────────────────────────────────
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, 13.333, 7.5, fill_rgb=LIGHT_BG)
add_rect(slide, 0, 0, 13.333, 1.0, fill_rgb=DARK_BLUE)
add_rect(slide, 0, 1.0, 0.07, 6.5, fill_rgb=ACCENT)
add_text(slide, "Definition & Overview", 0.3, 0.1, 12, 0.75,
font_size=26, bold=True, color=WHITE, align=PP_ALIGN.LEFT)
add_text(slide, "Harrison's 22e, Ch. 56 | Davidson's 22e, Ch. 16", 0.3, 0.72, 12, 0.3,
font_size=10, color=RGBColor(0xAA, 0xCC, 0xFF), italic=True)
# Definition box
add_rect(slide, 0.4, 1.15, 12.5, 1.1, fill_rgb=MED_BLUE, line_rgb=None)
add_text(slide, "Hyponatremia: Plasma Na⁺ concentration < 135 mEq/L (Severe: < 125 mEq/L)",
0.5, 1.2, 12.2, 0.9, font_size=17, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
# Stats box
add_rect(slide, 0.4, 2.4, 3.8, 1.5, fill_rgb=WHITE, line_rgb=ACCENT, line_width=1.5)
add_text(slide, "Epidemiology", 0.5, 2.45, 3.5, 0.35, font_size=13, bold=True, color=MED_BLUE)
add_multi_bullet(slide, [
"• Most common electrolyte disorder",
"• Occurs in up to 22% of hospitalized patients",
"• Higher prevalence in ICU patients",
"• Increased morbidity & mortality"
], 0.5, 2.82, 3.6, 1.05, font_size=11.5, color=TEXT_DARK)
# Pathophysiology box
add_rect(slide, 4.5, 2.4, 4.0, 1.5, fill_rgb=WHITE, line_rgb=ORANGE, line_width=1.5)
add_text(slide, "Core Mechanism", 4.6, 2.45, 3.7, 0.35, font_size=13, bold=True, color=ORANGE)
add_multi_bullet(slide, [
"• Relative excess of water vs. sodium",
"• Increase in circulating AVP (ADH)",
"• Increased renal sensitivity to AVP",
"• Combined with increased free water intake"
], 4.6, 2.82, 3.8, 1.05, font_size=11.5, color=TEXT_DARK)
# Serum osmolality box
add_rect(slide, 8.8, 2.4, 4.1, 1.5, fill_rgb=WHITE, line_rgb=GREEN, line_width=1.5)
add_text(slide, "Classification by Osmolality", 8.9, 2.45, 3.9, 0.35, font_size=13, bold=True, color=GREEN)
add_multi_bullet(slide, [
"• Hypotonic (true): Osmolality < 280 mOsm/kg",
"• Isotonic (pseudo): Normal osmolality",
"• Hypertonic: Osmolality > 295 mOsm/kg",
" (e.g., hyperglycemia, mannitol)"
], 8.9, 2.82, 3.9, 1.05, font_size=11.5, color=TEXT_DARK)
# Volume classification
add_rect(slide, 0.4, 4.1, 12.5, 2.1, fill_rgb=WHITE, line_rgb=MED_BLUE, line_width=1)
add_text(slide, "Classification by Volume Status (Most Clinically Relevant)", 0.6, 4.15, 12, 0.35,
font_size=13, bold=True, color=MED_BLUE)
cols = [
("HYPOVOLEMIC", "Volume depleted\n(Na⁺ deficit > H₂O deficit)", ORANGE, 0.6),
("EUVOLEMIC", "Normal volume\n(H₂O excess, normal Na⁺)", MED_BLUE, 4.8),
("HYPERVOLEMIC", "Edematous states\n(Na⁺ + H₂O excess)", GREEN, 9.0),
]
for label, desc, col, xp in cols:
add_rect(slide, xp, 4.55, 3.5, 1.5, fill_rgb=col)
add_text(slide, label, xp+0.05, 4.6, 3.35, 0.4, font_size=13, bold=True,
color=WHITE, align=PP_ALIGN.CENTER)
add_text(slide, desc, xp+0.05, 5.05, 3.35, 0.9, font_size=11, color=WHITE,
align=PP_ALIGN.CENTER, wrap=True)
# ─────────────────────────────────────────────────────────────────
# SLIDE 3 — ETIOLOGY (Hypovolemic & Euvolemic)
# ─────────────────────────────────────────────────────────────────
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, 13.333, 7.5, fill_rgb=LIGHT_BG)
add_rect(slide, 0, 0, 13.333, 1.0, fill_rgb=DARK_BLUE)
add_rect(slide, 0, 1.0, 0.07, 6.5, fill_rgb=ACCENT)
add_text(slide, "Etiology: Hypovolemic & Euvolemic Hyponatremia", 0.3, 0.1, 12.5, 0.75,
font_size=24, bold=True, color=WHITE)
# Hypovolemic
add_rect(slide, 0.4, 1.1, 6.0, 5.9, fill_rgb=WHITE, line_rgb=ORANGE, line_width=1.5)
add_rect(slide, 0.4, 1.1, 6.0, 0.5, fill_rgb=ORANGE)
add_text(slide, "HYPOVOLEMIC HYPONATREMIA (Urine Na⁺ varies)", 0.5, 1.12, 5.8, 0.45,
font_size=13, bold=True, color=WHITE)
add_text(slide, "Non-Renal (Urine Na⁺ < 20 mEq/L):", 0.55, 1.65, 5.7, 0.3,
font_size=12, bold=True, color=ORANGE)
add_multi_bullet(slide, [
"• GI losses: Vomiting, diarrhea, tube drainage",
"• Insensible losses: Sweating, burns",
"• Third spacing: Pancreatitis, peritonitis"
], 0.55, 1.95, 5.7, 0.85, font_size=11.5, color=TEXT_DARK)
add_text(slide, "Renal (Urine Na⁺ > 20 mEq/L):", 0.55, 2.85, 5.7, 0.3,
font_size=12, bold=True, color=ORANGE)
add_multi_bullet(slide, [
"• Thiazide diuretics (most common drug cause)",
"• Primary adrenal insufficiency / Hypoadrenalism",
"• Salt-losing nephropathies:",
" Reflux nephropathy, interstitial nephropathy,",
" medullary cystic disease, post-ATN recovery",
"• Cerebral salt wasting (CSW)",
"• Mineralocorticoid deficiency"
], 0.55, 3.15, 5.7, 1.8, font_size=11.5, color=TEXT_DARK)
add_text(slide, "Note: Thiazides block NaCl reabsorption in DCT → volume depletion + AVP surge", 0.55, 5.0, 5.7, 0.5,
font_size=10.5, italic=True, color=TEXT_GREY)
add_text(slide, "Hyperkalemia + hyponatremia + hypotension = suspect adrenal insufficiency!", 0.55, 5.5, 5.7, 0.4,
font_size=10.5, bold=True, color=RED)
# Euvolemic
add_rect(slide, 6.75, 1.1, 6.2, 5.9, fill_rgb=WHITE, line_rgb=MED_BLUE, line_width=1.5)
add_rect(slide, 6.75, 1.1, 6.2, 0.5, fill_rgb=MED_BLUE)
add_text(slide, "EUVOLEMIC HYPONATREMIA (Urine Na⁺ > 20 mEq/L)", 6.85, 1.12, 5.9, 0.45,
font_size=13, bold=True, color=WHITE)
add_text(slide, "SIAD (Syndrome of Inappropriate Antidiuresis) — Most Common:", 6.85, 1.65, 5.9, 0.35,
font_size=12, bold=True, color=MED_BLUE)
add_multi_bullet(slide, [
"• CNS: Meningitis, encephalitis, stroke, head trauma,",
" subarachnoid hemorrhage, psychosis",
"• Pulmonary: Pneumonia, TB, lung abscess, ARDS,",
" mechanical ventilation, pneumothorax",
"• Malignancy (ectopic ADH): Small cell lung cancer,",
" carcinoid, lymphoma, GI/GU cancers",
"• Drugs: SSRIs, TCAs, carbamazepine, cyclophosphamide,",
" vincristine, NSAIDs, opioids, chlorpropamide",
"• Idiopathic"
], 6.85, 2.02, 5.9, 2.3, font_size=11, color=TEXT_DARK)
add_text(slide, "Other Euvolemic Causes:", 6.85, 4.35, 5.9, 0.3,
font_size=12, bold=True, color=MED_BLUE)
add_multi_bullet(slide, [
"• Hypothyroidism (impaired free water excretion)",
"• Secondary adrenal insufficiency (ACTH deficiency)",
"• Beer potomania / Tea-and-toast diet",
" (Very low solute intake → inadequate free water excretion)",
"• Exercise-associated hyponatremia",
"• Psychogenic polydipsia"
], 6.85, 4.65, 5.9, 1.5, font_size=11, color=TEXT_DARK)
# ─────────────────────────────────────────────────────────────────
# SLIDE 4 — ETIOLOGY: Hypervolemic + SIAD Criteria
# ─────────────────────────────────────────────────────────────────
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, 13.333, 7.5, fill_rgb=LIGHT_BG)
add_rect(slide, 0, 0, 13.333, 1.0, fill_rgb=DARK_BLUE)
add_rect(slide, 0, 1.0, 0.07, 6.5, fill_rgb=ACCENT)
add_text(slide, "Etiology: Hypervolemic Hyponatremia & SIAD Diagnostic Criteria", 0.3, 0.1, 12.5, 0.75,
font_size=24, bold=True, color=WHITE)
# Hypervolemic box
add_rect(slide, 0.4, 1.1, 6.0, 5.9, fill_rgb=WHITE, line_rgb=GREEN, line_width=1.5)
add_rect(slide, 0.4, 1.1, 6.0, 0.5, fill_rgb=GREEN)
add_text(slide, "HYPERVOLEMIC HYPONATREMIA (Urine Na⁺ < 20 mEq/L)", 0.5, 1.12, 5.8, 0.45,
font_size=13, bold=True, color=WHITE)
add_text(slide, "Mechanism: Arterial underfilling → ↑AVP + RAAS activation", 0.55, 1.65, 5.7, 0.4,
font_size=11.5, italic=True, color=GREEN)
add_multi_bullet(slide, [
"Congestive Heart Failure (CHF):",
" • Decreased CO → baroreceptor activation → AVP release",
" • Responds to improved cardiac therapy (ACE inhibitors)",
"",
"Hepatic Cirrhosis:",
" • Splanchnic vasodilation → effective arterial underfilling",
" • Hyperaldosteronism + increased AVP",
" • Associated with ascites and peripheral edema",
"",
"Nephrotic Syndrome:",
" • Reduced oncotic pressure → interstitial edema",
" • Reduced effective circulating volume",
"",
"Advanced Chronic Kidney Disease:",
" • Impaired ability to excrete free water"
], 0.55, 2.1, 5.7, 4.6, font_size=11, color=TEXT_DARK)
# SIAD Criteria box
add_rect(slide, 6.75, 1.1, 6.2, 5.9, fill_rgb=WHITE, line_rgb=MED_BLUE, line_width=1.5)
add_rect(slide, 6.75, 1.1, 6.2, 0.5, fill_rgb=MED_BLUE)
add_text(slide, "SIAD — Diagnostic Criteria (Harrison's 22e)", 6.85, 1.12, 5.9, 0.45,
font_size=13, bold=True, color=WHITE)
add_text(slide, "Essential Criteria:", 6.85, 1.65, 5.9, 0.3,
font_size=12, bold=True, color=MED_BLUE)
add_multi_bullet(slide, [
"✓ Plasma osmolality < 275 mOsm/kg",
"✓ Urine osmolality > 100 mOsm/kg (inappropriately concentrated)",
"✓ Clinical euvolemia (no dehydration or edema)",
"✓ Urine Na⁺ > 40 mEq/L on normal salt & water intake",
"✓ Normal thyroid and adrenal function",
"✓ No recent diuretic use"
], 6.85, 1.98, 5.9, 1.7, font_size=11.5, color=TEXT_DARK)
add_text(slide, "Supplemental Criteria:", 6.85, 3.75, 5.9, 0.3,
font_size=12, bold=True, color=MED_BLUE)
add_multi_bullet(slide, [
"• Serum uric acid < 4 mg/dL (hypouricemia)",
"• BUN < 10 mg/dL",
"• Fractional excretion of Na > 1%",
"• Fractional excretion of uric acid > 12%",
"• Failure to correct with isotonic saline",
"• Plasma Na⁺ corrects with fluid restriction"
], 6.85, 4.08, 5.9, 1.6, font_size=11.5, color=TEXT_DARK)
add_rect(slide, 6.85, 5.75, 5.9, 0.5, fill_rgb=BLUEL)
add_text(slide, "SIAD = most common cause of euvolemic hyponatremia", 6.9, 5.8, 5.7, 0.4,
font_size=11, bold=True, color=MED_BLUE, align=PP_ALIGN.CENTER)
# ─────────────────────────────────────────────────────────────────
# SLIDE 5 — PATHOPHYSIOLOGY
# ─────────────────────────────────────────────────────────────────
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, 13.333, 7.5, fill_rgb=LIGHT_BG)
add_rect(slide, 0, 0, 13.333, 1.0, fill_rgb=DARK_BLUE)
add_rect(slide, 0, 1.0, 0.07, 6.5, fill_rgb=ACCENT)
add_text(slide, "Pathophysiology of Hyponatremia", 0.3, 0.1, 12.5, 0.75,
font_size=26, bold=True, color=WHITE)
# AVP axis
add_rect(slide, 0.4, 1.1, 12.5, 0.55, fill_rgb=MED_BLUE)
add_text(slide, "AVP (Vasopressin / ADH) — The Central Mediator", 0.5, 1.15, 12, 0.45,
font_size=15, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_multi_bullet(slide, [
"• Synthesized in supraoptic & paraventricular nuclei of hypothalamus → stored & released from posterior pituitary",
"• Release triggered by: ↑ plasma osmolality (primary), hypovolemia / arterial underfilling, nausea, pain, stress, certain drugs",
"• Acts on renal V2 receptors → inserts aquaporin-2 (AQP2) channels → increased water reabsorption in collecting duct",
"• Net result: Water retention → dilution of plasma sodium"
], 0.5, 1.7, 12.2, 1.1, font_size=11.5, color=TEXT_DARK)
# Three column pathways
# Left
add_rect(slide, 0.4, 2.9, 3.8, 3.8, fill_rgb=PEACH, line_rgb=ORANGE, line_width=1.5)
add_rect(slide, 0.4, 2.9, 3.8, 0.45, fill_rgb=ORANGE)
add_text(slide, "HYPOVOLEMIC Pathway", 0.5, 2.92, 3.6, 0.4, font_size=12, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_multi_bullet(slide, [
"Na⁺/H₂O loss (GI, renal, skin)",
"↓ ECFV & blood pressure",
"Baroreceptor activation",
"↑ AVP secretion",
"↑ Water reabsorption (V2R)",
"Water excess relative to Na⁺",
"→ Hyponatremia",
"",
"Urine: Na⁺ < 20 (extrarenal)",
" Na⁺ > 20 (renal losses)"
], 0.5, 3.38, 3.6, 3.0, font_size=11.5, color=TEXT_DARK)
# Middle
add_rect(slide, 4.55, 2.9, 4.2, 3.8, fill_rgb=BLUEL, line_rgb=MED_BLUE, line_width=1.5)
add_rect(slide, 4.55, 2.9, 4.2, 0.45, fill_rgb=MED_BLUE)
add_text(slide, "EUVOLEMIC Pathway (SIAD)", 4.65, 2.92, 4.0, 0.4, font_size=12, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_multi_bullet(slide, [
"CNS/pulmonary/drug stimulus",
"Inappropriate AVP secretion",
"↑ AQP2 expression in CD",
"↑ Free water retention",
"Normal Na⁺ excretion continues",
"Dilutional hyponatremia",
"→ Hypotonic hyponatremia",
"",
"Urine: Osm > 100 mOsm/kg",
" Na⁺ > 40 mEq/L"
], 4.65, 3.38, 4.0, 3.0, font_size=11.5, color=TEXT_DARK)
# Right
add_rect(slide, 9.1, 2.9, 3.8, 3.8, fill_rgb=GREENL, line_rgb=GREEN, line_width=1.5)
add_rect(slide, 9.1, 2.9, 3.8, 0.45, fill_rgb=GREEN)
add_text(slide, "HYPERVOLEMIC Pathway", 9.2, 2.92, 3.6, 0.4, font_size=12, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_multi_bullet(slide, [
"CHF / Cirrhosis / Nephrotic",
"↓ Effective arterial blood vol",
"Baroreceptor unloading",
"↑ Neurohumoral activation",
"↑ AVP + ↑ RAAS + ↑ SNS",
"Na⁺ & H₂O retention",
"H₂O retention > Na⁺ retention",
"→ Dilutional hyponatremia",
"",
"Urine: Na⁺ < 20 mEq/L (usually)"
], 9.2, 3.38, 3.6, 3.0, font_size=11.5, color=TEXT_DARK)
add_text(slide, "CD = Collecting Duct | AQP2 = Aquaporin-2 | ECFV = Extracellular Fluid Volume | RAAS = Renin-Angiotensin-Aldosterone System",
0.5, 6.8, 12, 0.3, font_size=9, italic=True, color=TEXT_GREY)
# ─────────────────────────────────────────────────────────────────
# SLIDE 6 — CLINICAL FEATURES
# ─────────────────────────────────────────────────────────────────
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, 13.333, 7.5, fill_rgb=LIGHT_BG)
add_rect(slide, 0, 0, 13.333, 1.0, fill_rgb=DARK_BLUE)
add_rect(slide, 0, 1.0, 0.07, 6.5, fill_rgb=ACCENT)
add_text(slide, "Clinical Features of Hyponatremia", 0.3, 0.1, 12.5, 0.75,
font_size=26, bold=True, color=WHITE)
# Key principle banner
add_rect(slide, 0.4, 1.1, 12.5, 0.6, fill_rgb=MED_BLUE)
add_text(slide, "Severity of symptoms correlates with RATE of fall in Na⁺ and absolute Na⁺ level, not just the value alone",
0.5, 1.15, 12.2, 0.5, font_size=13, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
# Acute vs Chronic
add_rect(slide, 0.4, 1.85, 6.0, 2.2, fill_rgb=PEACH, line_rgb=RED, line_width=1.5)
add_rect(slide, 0.4, 1.85, 6.0, 0.45, fill_rgb=RED)
add_text(slide, "ACUTE Hyponatremia (< 48 hours)", 0.5, 1.87, 5.7, 0.4, font_size=13, bold=True, color=WHITE)
add_multi_bullet(slide, [
"• Brain has no time to adapt → cerebral edema",
"• Symptoms more severe at higher Na⁺ levels",
"• Headache, nausea, vomiting",
"• Confusion, lethargy, obtundation",
"• Seizures, respiratory arrest",
"• Cerebral herniation (life-threatening)",
"• High risk of death if untreated"
], 0.5, 2.32, 5.7, 1.65, font_size=11.5, color=TEXT_DARK)
add_rect(slide, 6.75, 1.85, 6.2, 2.2, fill_rgb=BLUEL, line_rgb=MED_BLUE, line_width=1.5)
add_rect(slide, 6.75, 1.85, 6.2, 0.45, fill_rgb=MED_BLUE)
add_text(slide, "CHRONIC Hyponatremia (> 48 hours)", 6.85, 1.87, 5.9, 0.4, font_size=13, bold=True, color=WHITE)
add_multi_bullet(slide, [
"• Brain adapts by extruding organic osmolytes",
"• (Glutamine, myoinositol, taurine) — reduces edema",
"• Symptoms milder at similar Na⁺ levels",
"• Nausea, malaise, fatigue",
"• Cognitive impairment, gait disturbance",
"• Increased fall risk & fracture risk",
"• Risk of ODS if corrected too rapidly"
], 6.85, 2.32, 5.9, 1.65, font_size=11.5, color=TEXT_DARK)
# Symptom spectrum
add_rect(slide, 0.4, 4.15, 12.5, 2.8, fill_rgb=WHITE, line_rgb=ACCENT, line_width=1)
add_text(slide, "Symptom Spectrum by Na⁺ Level (Harrison's 22e)", 0.55, 4.2, 12, 0.35,
font_size=13, bold=True, color=DARK_BLUE)
levels = [
("Na⁺ 130–135\nmEq/L", "Usually\nasymptomatic\nor mild fatigue", GREENL, GREEN),
("Na⁺ 125–130\nmEq/L", "Nausea,\nheadache,\nmalaise", BLUEL, MED_BLUE),
("Na⁺ 120–125\nmEq/L", "Vomiting,\nconfusion,\nsomnolence", YELLOW_BG, ORANGE),
("Na⁺ < 120\nmEq/L", "Seizures,\ncoma,\nrespiratory arrest", PEACH, RED),
]
for i, (level, sym, bg, col) in enumerate(levels):
xpos = 0.5 + i * 3.1
add_rect(slide, xpos, 4.6, 2.9, 2.1, fill_rgb=bg, line_rgb=col, line_width=1.5)
add_text(slide, level, xpos+0.05, 4.65, 2.75, 0.7, font_size=12, bold=True,
color=col, align=PP_ALIGN.CENTER)
add_text(slide, sym, xpos+0.05, 5.35, 2.75, 1.25, font_size=11.5, color=TEXT_DARK,
align=PP_ALIGN.CENTER, wrap=True)
# ─────────────────────────────────────────────────────────────────
# SLIDE 7 — DIAGNOSTIC APPROACH
# ─────────────────────────────────────────────────────────────────
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, 13.333, 7.5, fill_rgb=LIGHT_BG)
add_rect(slide, 0, 0, 13.333, 1.0, fill_rgb=DARK_BLUE)
add_rect(slide, 0, 1.0, 0.07, 6.5, fill_rgb=ACCENT)
add_text(slide, "Diagnostic Approach to Hyponatremia", 0.3, 0.1, 12.5, 0.75,
font_size=26, bold=True, color=WHITE)
# Step 1
add_rect(slide, 0.4, 1.1, 12.5, 0.5, fill_rgb=MED_BLUE)
add_text(slide, "STEP 1: Confirm True Hyponatremia — Measure Serum Osmolality", 0.5, 1.15, 12, 0.4,
font_size=13, bold=True, color=WHITE)
# Three osmolality boxes
osm_data = [
("Hypotonic\n< 280 mOsm/kg", "TRUE hyponatremia\n→ Proceed to Step 2", BLUEL, MED_BLUE),
("Isotonic\n280–295 mOsm/kg", "Pseudohyponatremia\n(hyperlipidemia,\nhyperproteinemia)", GREENL, GREEN),
("Hypertonic\n> 295 mOsm/kg", "Translocational:\nHyperglycemia, mannitol,\nsorbitol, glycine", PEACH, RED),
]
for i, (osm, cause, bg, col) in enumerate(osm_data):
xp = 0.4 + i * 4.3
add_rect(slide, xp, 1.65, 4.0, 1.2, fill_rgb=bg, line_rgb=col, line_width=1.5)
add_text(slide, osm, xp+0.1, 1.7, 3.8, 0.55, font_size=12, bold=True, color=col, align=PP_ALIGN.CENTER)
add_text(slide, cause, xp+0.1, 2.25, 3.8, 0.6, font_size=11, color=TEXT_DARK, align=PP_ALIGN.CENTER, wrap=True)
# Step 2
add_rect(slide, 0.4, 3.0, 12.5, 0.5, fill_rgb=MED_BLUE)
add_text(slide, "STEP 2: Assess Volume Status → STEP 3: Measure Urine Sodium & Urine Osmolality", 0.5, 3.05, 12, 0.4,
font_size=13, bold=True, color=WHITE)
# Table
headers = ["Parameter", "Hypovolemic", "Euvolemic (SIAD)", "Hypervolemic"]
hcolors = [DARK_BLUE, ORANGE, MED_BLUE, GREEN]
col_ws = [3.0, 2.8, 3.3, 3.1]
col_xs = [0.4, 3.4, 6.2, 9.5]
# Header row
for j, (hdr, hcol, cw, cx) in enumerate(zip(headers, hcolors, col_ws, col_xs)):
add_rect(slide, cx, 3.55, cw, 0.4, fill_rgb=hcol)
add_text(slide, hdr, cx+0.05, 3.57, cw-0.1, 0.35, font_size=11.5, bold=True,
color=WHITE, align=PP_ALIGN.CENTER)
rows = [
("Urine Na⁺", "< 20 (extrarenal)\n> 20 (renal)", "> 40 mEq/L", "< 20 mEq/L"),
("Urine Osmolality", "> 400 mOsm/kg", "> 100 mOsm/kg", "Variable"),
("Serum Uric Acid", "Normal/high", "Low (< 4 mg/dL)", "Normal"),
("BUN/Cr ratio", "> 20 (prerenal)", "Low-normal", "Variable"),
("Clinical", "Dry mucosa, tachycardia,\nlow JVP, orthostasis", "No edema, no\ndehydration signs", "Edema, ascites,\nraised JVP"),
]
row_h = 0.55
for ri, row in enumerate(rows):
y = 3.95 + ri * row_h
bg = WHITE if ri % 2 == 0 else LIGHT_BG
for j, (val, cw, cx) in enumerate(zip(row, col_ws, col_xs)):
add_rect(slide, cx, y, cw, row_h, fill_rgb=bg, line_rgb=RGBColor(0xCC, 0xDD, 0xEE), line_width=0.5)
add_text(slide, val, cx+0.08, y+0.03, cw-0.12, row_h-0.06, font_size=10.5,
color=TEXT_DARK, wrap=True)
# ─────────────────────────────────────────────────────────────────
# SLIDE 8 — TREATMENT: PRINCIPLES
# ─────────────────────────────────────────────────────────────────
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, 13.333, 7.5, fill_rgb=LIGHT_BG)
add_rect(slide, 0, 0, 13.333, 1.0, fill_rgb=DARK_BLUE)
add_rect(slide, 0, 1.0, 0.07, 6.5, fill_rgb=ACCENT)
add_text(slide, "Treatment Principles & ODS Prevention (Harrison's 22e)", 0.3, 0.1, 12.5, 0.75,
font_size=24, bold=True, color=WHITE)
# Three guiding principles
add_rect(slide, 0.4, 1.1, 12.5, 0.5, fill_rgb=MED_BLUE)
add_text(slide, "THREE KEY TREATMENT PRINCIPLES (Harrison's 22e)", 0.5, 1.15, 12, 0.4,
font_size=14, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
princ = [
("1", "Symptom Severity\nDetermines Urgency", "Assess whether acute (<48h) vs chronic (>48h);\nhigh symptom burden warrants immediate correction", ORANGE),
("2", "ODS Risk in\nChronic Cases", "Risk if Na⁺ corrected > 8–10 mEq/L in 24h\nor > 18 mEq/L in 48h in chronic hyponatremia", RED),
("3", "Frequent Monitoring\nRequired", "Response to hypertonic saline, isotonic saline,\nor AVP antagonists is unpredictable", MED_BLUE),
]
for i, (num, title, desc, col) in enumerate(princ):
xp = 0.4 + i * 4.3
add_rect(slide, xp, 1.65, 4.0, 1.7, fill_rgb=WHITE, line_rgb=col, line_width=2)
add_rect(slide, xp, 1.65, 4.0, 0.45, fill_rgb=col)
add_text(slide, f"Principle {num}: {title}", xp+0.1, 1.67, 3.7, 0.42, font_size=12, bold=True,
color=WHITE, align=PP_ALIGN.CENTER)
add_text(slide, desc, xp+0.1, 2.15, 3.8, 1.15, font_size=11, color=TEXT_DARK, wrap=True)
# ODS box
add_rect(slide, 0.4, 3.5, 6.0, 3.7, fill_rgb=PEACH, line_rgb=RED, line_width=2)
add_rect(slide, 0.4, 3.5, 6.0, 0.45, fill_rgb=RED)
add_text(slide, "⚠ Osmotic Demyelination Syndrome (ODS)", 0.5, 3.52, 5.8, 0.42, font_size=13, bold=True, color=WHITE)
add_multi_bullet(slide, [
"Formerly called 'Central Pontine Myelinolysis'",
"Occurs when chronic hyponatremia corrected too rapidly",
"Mechanism: Rapid osmotic stress after adaptation by",
" organic osmolyte depletion → myelin sheath damage",
"",
"Clinical features (2–6 days post-correction):",
"• Dysarthria, dysphagia",
"• Paraplegia / quadriplegia",
"• 'Locked-in' syndrome",
"• Altered consciousness",
"",
"Risk factors: Alcoholism, malnutrition, hypokalemia,",
" liver disease, burn patients",
"",
"Prevention: Strict correction rate limits (< 8–10 mEq/L/day)",
"If overcorrected: Administer D5W or desmopressin to lower Na⁺"
], 0.5, 3.98, 5.7, 3.0, font_size=11, color=TEXT_DARK)
# Correction rate box
add_rect(slide, 6.75, 3.5, 6.2, 3.7, fill_rgb=BLUEL, line_rgb=MED_BLUE, line_width=1.5)
add_rect(slide, 6.75, 3.5, 6.2, 0.45, fill_rgb=MED_BLUE)
add_text(slide, "Safe Correction Rate Guidelines", 6.85, 3.52, 5.9, 0.42, font_size=13, bold=True, color=WHITE)
add_multi_bullet(slide, [
"ACUTE hyponatremia (< 48 h, symptomatic):",
"• Target: Raise Na⁺ by 1–2 mEq/L/hour initially",
"• Continue until symptoms resolve",
"• Can raise by up to 4–6 mEq/L in first 1–2 hours",
"",
"CHRONIC hyponatremia (> 48 h):",
"• Maximum: 8–10 mEq/L per 24 hours",
"• Maximum: 18 mEq/L per 48 hours",
"• Aim for 4–8 mEq/L per 24 hours ideally",
"",
"Frequent monitoring:",
"• Check serum Na⁺ every 2–4 hours during therapy",
"• Adjust infusion rate based on response",
"",
"Overcorrection rescue:",
"• Stop hypertonic saline immediately",
"• Give D5W 3–5 mL/kg/h + DDAVP 2 mcg IV",
"• Goal: Reduce Na⁺ back to safe range"
], 6.85, 3.98, 5.9, 3.0, font_size=11, color=TEXT_DARK)
# ─────────────────────────────────────────────────────────────────
# SLIDE 9 — TREATMENT BY VOLUME STATUS
# ─────────────────────────────────────────────────────────────────
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, 13.333, 7.5, fill_rgb=LIGHT_BG)
add_rect(slide, 0, 0, 13.333, 1.0, fill_rgb=DARK_BLUE)
add_rect(slide, 0, 1.0, 0.07, 6.5, fill_rgb=ACCENT)
add_text(slide, "Treatment by Volume Status", 0.3, 0.1, 12.5, 0.75,
font_size=26, bold=True, color=WHITE)
col_data = [
("HYPOVOLEMIC", ORANGE, PEACH, [
"Isotonic (0.9%) normal saline IV",
"• Rapidly reduces AVP → brisk water diuresis",
"• Replenishes Na⁺-Cl⁻ deficit",
"• Monitor for rapid correction",
"",
"Oral Na⁺/Cl⁻ supplementation if mild",
"",
"Address underlying cause:",
"• Vomiting/diarrhea → antiemetics, antidiarrhea",
"• Diuretics → stop thiazide",
"• Adrenal insufficiency → hydrocortisone",
"",
"Beer potomania / Low solute diet:",
"• IV saline + resume normal diet",
"• High risk ODS — monitor closely!"
]),
("EUVOLEMIC (SIAD)", MED_BLUE, BLUEL, [
"Treat underlying cause first:",
"• Malignancy, CNS disease, drug withdrawal",
"• Hypothyroidism → levothyroxine",
"• Secondary AI → hydrocortisone",
"",
"Fluid restriction (cornerstone):",
"• Urine/Plasma Na+K ratio > 1 → < 500 mL/d",
"• Ratio ~1 → 500–700 mL/d",
"• Ratio < 1 → < 1000 mL/d",
"",
"Salt tablets + loop diuretics",
"(furosemide) — increases electrolyte-free",
"water excretion",
"",
"Urea (oral): 15–60 g/day — increases",
"solute excretion, effective in SIAD"
]),
("HYPERVOLEMIC", GREEN, GREENL, [
"Treat underlying cause:",
"• CHF → optimize heart failure therapy",
" ACE inhibitors, beta-blockers, diuretics",
"• Cirrhosis → restrict free water",
" spironolactone, furosemide",
"• Nephrotic syndrome → treat primary cause",
"",
"Fluid restriction + dietary Na⁺ restriction",
"",
"Loop diuretics (furosemide):",
"• Increase electrolyte-free water excretion",
"• Combined Na⁺ restriction",
"",
"Vaptans (V2R antagonists):",
"• Tolvaptan — for CHF / cirrhosis",
"• Monitor LFTs closely with tolvaptan",
"• FDA: Avoid > 30 days in cirrhosis"
]),
]
for i, (title, hcol, bg, items) in enumerate(col_data):
xp = 0.4 + i * 4.3
add_rect(slide, xp, 1.1, 4.0, 5.9, fill_rgb=bg, line_rgb=hcol, line_width=1.5)
add_rect(slide, xp, 1.1, 4.0, 0.5, fill_rgb=hcol)
add_text(slide, title, xp+0.05, 1.12, 3.85, 0.45, font_size=13, bold=True,
color=WHITE, align=PP_ALIGN.CENTER)
add_multi_bullet(slide, items, xp+0.1, 1.65, 3.75, 5.2, font_size=11, color=TEXT_DARK)
# ─────────────────────────────────────────────────────────────────
# SLIDE 10 — HYPERTONIC SALINE & PHARMACOTHERAPY
# ─────────────────────────────────────────────────────────────────
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, 13.333, 7.5, fill_rgb=LIGHT_BG)
add_rect(slide, 0, 0, 13.333, 1.0, fill_rgb=DARK_BLUE)
add_rect(slide, 0, 1.0, 0.07, 6.5, fill_rgb=ACCENT)
add_text(slide, "Hypertonic Saline & Pharmacological Therapy", 0.3, 0.1, 12.5, 0.75,
font_size=24, bold=True, color=WHITE)
# Hypertonic saline
add_rect(slide, 0.4, 1.1, 6.0, 5.9, fill_rgb=WHITE, line_rgb=RED, line_width=1.5)
add_rect(slide, 0.4, 1.1, 6.0, 0.5, fill_rgb=RED)
add_text(slide, "3% Hypertonic Saline (514 mEq/L Na⁺)", 0.5, 1.12, 5.8, 0.45,
font_size=13, bold=True, color=WHITE)
add_text(slide, "Indications:", 0.55, 1.65, 5.7, 0.3, font_size=12, bold=True, color=RED)
add_multi_bullet(slide, [
"• Acute symptomatic hyponatremia with seizures/coma",
"• Acute hyponatremia regardless of absolute level",
"• Symptoms of cerebral herniation",
"• Severe/rapidly developing symptoms"
], 0.55, 1.97, 5.7, 1.0, font_size=11.5, color=TEXT_DARK)
add_text(slide, "Dosing Protocol:", 0.55, 3.0, 5.7, 0.3, font_size=12, bold=True, color=RED)
add_multi_bullet(slide, [
"• BOLUS for severe symptoms:",
" 100–150 mL 3% NaCl IV over 15–20 min",
" Can repeat up to 3 boluses if seizures persist",
"",
"• INFUSION for less urgent correction:",
" Rate = 0.5–1 mL/kg/hour (adjust per Na⁺ target)",
" ADROGUE-MADIAS formula to estimate Na⁺ change:",
" ΔNa = (Infusate Na – Serum Na) / (TBW + 1)",
"",
"• Check serum Na⁺ every 2 hours",
"• Stop when Na⁺ increases 4–6 mEq/L (acute)",
" or target rate reached in chronic"
], 0.55, 3.32, 5.7, 2.45, font_size=11.5, color=TEXT_DARK)
add_rect(slide, 0.5, 5.85, 5.7, 0.55, fill_rgb=PEACH)
add_text(slide, "Central line preferred; peripheral IV acceptable for short-term emergency use", 0.6, 5.9, 5.5, 0.45,
font_size=10.5, italic=True, color=RED, wrap=True)
# Pharmacotherapy
add_rect(slide, 6.75, 1.1, 6.2, 5.9, fill_rgb=WHITE, line_rgb=MED_BLUE, line_width=1.5)
add_rect(slide, 6.75, 1.1, 6.2, 0.5, fill_rgb=MED_BLUE)
add_text(slide, "Pharmacological Options for SIAD / Refractory Cases", 6.85, 1.12, 5.9, 0.45,
font_size=12, bold=True, color=WHITE)
drug_data = [
("Vaptans (V2R Antagonists)", MED_BLUE, [
"Tolvaptan (oral): 15–60 mg/day",
"• FDA-approved for euvolemic/hypervolemic",
"• Selective electrolyte-free water excretion",
"• Avoid in liver disease (hepatotoxic)",
"• Do not use for > 30 days (cirrhosis)",
"Conivaptan (IV): CHF setting"
]),
("Demeclocycline", ORANGE, [
"• 300–600 mg twice daily",
"• Blocks ADH effect on collecting duct",
"• Onset: 3–6 days (slow)",
"• Nephrotoxic in cirrhosis — avoid"
]),
("Urea (Oral)", GREEN, [
"• 15–60 g/day in divided doses",
"• Increases renal solute excretion",
"• Effective in SIAD, particularly cancer-related",
"• Good safety profile, cheap",
"• Bitter taste — poor compliance"
]),
]
y_cur = 1.65
for dname, dcol, ditems in drug_data:
add_text(slide, dname, 6.9, y_cur, 5.7, 0.3, font_size=12, bold=True, color=dcol)
y_cur += 0.3
add_multi_bullet(slide, ditems, 6.9, y_cur, 5.7, len(ditems)*0.28, font_size=11, color=TEXT_DARK)
y_cur += len(ditems) * 0.28 + 0.12
add_rect(slide, 6.9, y_cur, 5.7, 0.02, fill_rgb=RGBColor(0xCC, 0xCC, 0xCC))
y_cur += 0.12
# ─────────────────────────────────────────────────────────────────
# SLIDE 11 — SPECIAL SITUATIONS
# ─────────────────────────────────────────────────────────────────
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, 13.333, 7.5, fill_rgb=LIGHT_BG)
add_rect(slide, 0, 0, 13.333, 1.0, fill_rgb=DARK_BLUE)
add_rect(slide, 0, 1.0, 0.07, 6.5, fill_rgb=ACCENT)
add_text(slide, "Special Clinical Situations", 0.3, 0.1, 12.5, 0.75,
font_size=26, bold=True, color=WHITE)
special = [
("Thiazide-Induced\nHyponatremia", ORANGE, PEACH, [
"Most common drug cause",
"• Blocks NaCl reabsorption in DCT",
"• Multiple mechanisms: AVP release,",
" polydipsia, K⁺ depletion",
"• Stop thiazide immediately",
"• Replace K⁺ (K⁺ correction raises Na⁺)",
"• Monitor for rapid correction",
"• Elderly women most susceptible"
]),
("Exercise-Associated\nHyponatremia", MED_BLUE, BLUEL, [
"Endurance athletes (marathons)",
"• Excess hypotonic fluid intake",
"• Increased AVP secretion",
"• Na⁺ < 130 mEq/L is dangerous",
"• Treatment: Hypertonic saline if symptomatic",
"• Prevention: Drink to thirst only",
"• No excessive water during race"
]),
("Beer Potomania /\nLow Solute Intake", GREEN, GREENL, [
"High risk of ODS on correction",
"• Very low daily solute excretion",
"• Cannot generate free water excretion",
"• Responds quickly to IV saline",
"• Associated: alcoholism, malnutrition,",
" hypokalemia → all ODS risk factors",
"• Strict correction rate limits essential"
]),
("Hypothyroidism &\nAdrenal Insufficiency", RED, PEACH, [
"Hypothyroidism:",
"• Impairs renal free water excretion",
"• Treat with levothyroxine",
"• Na⁺ corrects as thyroid function normalizes",
"",
"Primary Adrenal Insufficiency:",
"• Na⁺ + K⁺ findings + hypotension → suspect",
"• Give hydrocortisone + fludrocortisone",
"• Do not delay in suspected AI crisis"
]),
]
positions = [(0.4, 1.1), (6.8, 1.1), (0.4, 4.2), (6.8, 4.2)]
for (xp, yp), (title, hcol, bg, items) in zip(positions, special):
add_rect(slide, xp, yp, 6.0, 3.1, fill_rgb=bg, line_rgb=hcol, line_width=1.5)
add_rect(slide, xp, yp, 6.0, 0.5, fill_rgb=hcol)
add_text(slide, title, xp+0.1, yp+0.03, 5.7, 0.44, font_size=13, bold=True, color=WHITE)
add_multi_bullet(slide, items, xp+0.15, yp+0.55, 5.7, 2.45, font_size=11, color=TEXT_DARK)
# ─────────────────────────────────────────────────────────────────
# SLIDE 12 — SUMMARY / KEY POINTS
# ─────────────────────────────────────────────────────────────────
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, 13.333, 7.5, fill_rgb=DARK_BLUE)
add_rect(slide, 0, 1.0, 0.07, 5.9, fill_rgb=ACCENT)
add_text(slide, "Key Clinical Pearls — Hyponatremia", 0.3, 0.1, 12.5, 0.8,
font_size=28, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
# Two columns
left = [
"1. Na⁺ < 135 mEq/L = hyponatremia; Na⁺ < 125 = severe",
"2. Always check serum osmolality first to confirm true vs pseudo-hyponatremia",
"3. Classify by volume status: hypovolemic, euvolemic, hypervolemic",
"4. SIAD: most common cause of euvolemic hyponatremia; diagnose by exclusion",
"5. Urine Na⁺ < 20 suggests hypovolemic or hypervolemic; > 40 suggests SIAD",
"6. Rate of fall matters more than absolute level for symptoms in chronic cases",
]
right = [
"7. Acute symptomatic hyponatremia: 3% hypertonic saline — bolus 100–150 mL",
"8. Chronic hyponatremia: correct ≤ 8–10 mEq/L per 24h to prevent ODS",
"9. ODS is irreversible; prevention is the only treatment",
"10. K⁺ replacement also raises Na⁺ — account for this in correction targets",
"11. Tolvaptan (vaptan): effective in SIAD/CHF — avoid in liver disease > 30d",
"12. Treat the underlying cause — Na⁺ often corrects with etiology treatment",
]
add_rect(slide, 0.4, 1.0, 6.1, 6.0, fill_rgb=MED_BLUE)
add_multi_bullet(slide, left, 0.55, 1.1, 5.8, 5.8, font_size=13, color=WHITE)
add_rect(slide, 6.85, 1.0, 6.1, 6.0, fill_rgb=RGBColor(0x12, 0x3A, 0x70))
add_multi_bullet(slide, right, 7.0, 1.1, 5.8, 5.8, font_size=13, color=WHITE)
add_text(slide, "Reference: Harrison's Principles of Internal Medicine, 22nd Edition (2025, McGraw-Hill) | Davidson's Principles & Practice of Medicine, 24th Ed.",
0.3, 7.1, 12.7, 0.35, font_size=9, color=RGBColor(0xAA, 0xCC, 0xFF), italic=True, align=PP_ALIGN.CENTER)
# Save
output_path = "/tmp/workspace/hyponatremia-ppt/Hyponatremia_Harrison_Davidson.pptx"
buf = BytesIO()
prs.save(buf)
with open(output_path, "wb") as f:
f.write(buf.getvalue())
print(f"Saved: {output_path}")
print(f"Slides: {len(prs.slides)}")
cd /tmp/workspace/hyponatremia-ppt && python create_ppt.py
ls -lh /tmp/workspace/hyponatremia-ppt/
Hyponatremia Harrison Davidson
Presentation · PPTX
| Slide | Content |
|---|---|
| 1 | Title slide |
| 2 | Definition, epidemiology (up to 22% of hospitalized patients), classification by osmolality & volume |
| 3 | Etiology: Hypovolemic (GI/renal causes) & Euvolemic (SIAD + drugs/CNS/pulmonary/malignancy) |
| 4 | Etiology: Hypervolemic (CHF/cirrhosis/nephrotic) + full SIAD diagnostic criteria |
| 5 | Pathophysiology: AVP mechanism + three parallel pathways (hypo/eu/hypervolemic) |
| 6 | Clinical features: Acute vs chronic, symptom spectrum by Na⁺ level |
| 7 | Diagnostic approach: Serum osmolality → volume status → urine Na⁺/osmolality table |
| 8 | Treatment principles: 3 key rules, ODS prevention, safe correction rate guidelines |
| 9 | Treatment by volume status: Saline for hypovolemic, fluid restriction for SIAD, vaptans for hypervolemic |
| 10 | Hypertonic saline protocol + pharmacotherapy (tolvaptan, demeclocycline, urea) |
| 11 | Special situations: Thiazide-induced, exercise-associated, beer potomania, hypothyroidism/AI |
| 12 | Key clinical pearls summary (12 take-home points) |
Make the ppt a little more extended or to be able to make a 10 -15 minute presentation
~/hyponatremia-ppt/create_ppt_v2.py
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
from pptx.oxml.ns import qn
from lxml import etree
from io import BytesIO
# ── Color palette ─────────────────────────────────────────────────
DARK_BLUE = RGBColor(0x0D, 0x2B, 0x55)
MED_BLUE = RGBColor(0x1A, 0x5C, 0x9A)
ACCENT = RGBColor(0x00, 0xA8, 0xCC)
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
LIGHT_BG = RGBColor(0xF0, 0xF5, 0xFA)
TEXT_DARK = RGBColor(0x1A, 0x1A, 0x2E)
TEXT_GREY = RGBColor(0x44, 0x55, 0x66)
ORANGE = RGBColor(0xE8, 0x6A, 0x10)
GREEN = RGBColor(0x0B, 0x7A, 0x4B)
RED = RGBColor(0xC0, 0x39, 0x2B)
YELLOW_BG = RGBColor(0xFF, 0xF3, 0xCD)
PEACH = RGBColor(0xFD, 0xED, 0xED)
GREENL = RGBColor(0xE8, 0xF8, 0xF0)
BLUEL = RGBColor(0xE8, 0xF4, 0xFF)
PURPLE = RGBColor(0x6A, 0x0D, 0x83)
PURPLEL = RGBColor(0xF3, 0xE8, 0xF8)
TEAL_D = RGBColor(0x00, 0x6E, 0x8A)
prs = Presentation()
prs.slide_width = Inches(13.333)
prs.slide_height = Inches(7.5)
blank = prs.slide_layouts[6]
# ── Helpers ────────────────────────────────────────────────────────
def add_rect(slide, x, y, w, h, fill_rgb=None, line_rgb=None, line_width=None):
shape = slide.shapes.add_shape(1, Inches(x), Inches(y), Inches(w), Inches(h))
if fill_rgb:
shape.fill.solid()
shape.fill.fore_color.rgb = fill_rgb
else:
shape.fill.background()
if line_rgb:
shape.line.color.rgb = line_rgb
if line_width:
shape.line.width = Pt(line_width)
else:
shape.line.fill.background()
return shape
def add_text(slide, text, x, y, w, h, font_size=14, bold=False, color=TEXT_DARK,
align=PP_ALIGN.LEFT, italic=False, wrap=True, anchor=MSO_ANCHOR.TOP):
tb = slide.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h))
tf = tb.text_frame
tf.word_wrap = wrap
tf.vertical_anchor = anchor
tf.margin_left = Inches(0.05)
tf.margin_right = Inches(0.05)
tf.margin_top = Inches(0.03)
tf.margin_bottom= Inches(0.03)
p = tf.paragraphs[0]
p.alignment = align
run = p.add_run()
run.text = text
run.font.size = Pt(font_size)
run.font.bold = bold
run.font.italic= italic
run.font.color.rgb = color
run.font.name = "Calibri"
return tb
def add_bullets(slide, items, x, y, w, h, font_size=12, color=TEXT_DARK, bold_idx=None):
"""items: list of strings; prefix with ' ' for sub-bullets"""
tb = slide.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h))
tf = tb.text_frame
tf.word_wrap = True
tf.margin_left = Inches(0.05)
tf.margin_right = Inches(0.05)
tf.margin_top = Inches(0.04)
tf.margin_bottom= Inches(0.04)
for i, item in enumerate(items):
p = tf.paragraphs[0] if i == 0 else tf.add_paragraph()
p.alignment = PP_ALIGN.LEFT
run = p.add_run()
run.text = item
run.font.size = Pt(font_size)
run.font.color.rgb = color
run.font.name = "Calibri"
if bold_idx and i in bold_idx:
run.font.bold = True
return tb
def slide_header(slide, title, subtitle=None):
add_rect(slide, 0, 0, 13.333, 7.5, fill_rgb=LIGHT_BG)
add_rect(slide, 0, 0, 13.333, 1.0, fill_rgb=DARK_BLUE)
add_rect(slide, 0, 1.0, 0.07, 6.5, fill_rgb=ACCENT)
add_text(slide, title, 0.3, 0.08, 12.8, 0.72, font_size=25, bold=True, color=WHITE)
if subtitle:
add_text(slide, subtitle, 0.3, 0.72, 12.8, 0.28, font_size=10,
italic=True, color=RGBColor(0xAA, 0xCC, 0xFF))
def section_box(slide, title, items, x, y, w, h, hcol, bgcol, font_size=11):
add_rect(slide, x, y, w, h, fill_rgb=bgcol, line_rgb=hcol, line_width=1.5)
add_rect(slide, x, y, w, 0.44, fill_rgb=hcol)
add_text(slide, title, x+0.08, y+0.03, w-0.12, 0.38, font_size=12.5,
bold=True, color=WHITE)
add_bullets(slide, items, x+0.12, y+0.48, w-0.18, h-0.55, font_size=font_size)
# ══════════════════════════════════════════════════════════════════
# SLIDE 1 — TITLE
# ══════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, 13.333, 7.5, fill_rgb=DARK_BLUE)
add_rect(slide, 0, 5.75, 13.333, 0.14, fill_rgb=ACCENT)
add_rect(slide, 0, 5.89, 13.333, 1.61, fill_rgb=MED_BLUE)
add_text(slide, "HYPONATREMIA", 0.8, 1.3, 11.7, 1.6,
font_size=54, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_text(slide, "Pathophysiology • Diagnosis • Management",
0.8, 3.0, 11.7, 0.65, font_size=22, italic=True, color=ACCENT, align=PP_ALIGN.CENTER)
add_text(slide, "Based on Harrison's Principles of Internal Medicine, 22nd Ed. (2025) & Davidson's Principles and Practice of Medicine, 24th Ed.",
0.8, 3.75, 11.7, 0.55, font_size=11.5,
color=RGBColor(0xAA, 0xCC, 0xEE), align=PP_ALIGN.CENTER)
add_text(slide, "Department of Internal Medicine | Clinical Presentation | 2026",
0.8, 6.1, 11.7, 0.5, font_size=13, color=WHITE, align=PP_ALIGN.CENTER)
# ══════════════════════════════════════════════════════════════════
# SLIDE 2 — AGENDA / OUTLINE
# ══════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
slide_header(slide, "Presentation Outline",
"Harrison's 22e Ch. 56 & 98 | Davidson's 24e Ch. 16")
agenda = [
("1.", "Introduction & Epidemiology", MED_BLUE),
("2.", "Normal Sodium Physiology & AVP", TEAL_D),
("3.", "Classification & Pathophysiology",ORANGE),
("4.", "Etiology: All Three Types", GREEN),
("5.", "SIAD — Diagnosis & Subtypes", MED_BLUE),
("6.", "Clinical Features & Symptoms", PURPLE),
("7.", "Investigations: Step-by-Step", TEAL_D),
("8.", "Diagnostic Algorithm", ORANGE),
("9.", "Treatment Principles & ODS", RED),
("10.","Treatment by Volume Status", GREEN),
("11.","Hypertonic Saline & Pharmacotherapy", RED),
("12.","Special Clinical Situations", MED_BLUE),
("13.","Clinical Case Vignette", PURPLE),
("14.","Key Pearls & Summary", DARK_BLUE),
]
cols = [agenda[:7], agenda[7:]]
for ci, col in enumerate(cols):
xbase = 0.5 + ci * 6.5
for ri, (num, topic, col_c) in enumerate(col):
ypos = 1.15 + ri * 0.8
add_rect(slide, xbase, ypos, 6.1, 0.7, fill_rgb=WHITE,
line_rgb=col_c, line_width=1.5)
add_rect(slide, xbase, ypos, 0.55, 0.7, fill_rgb=col_c)
add_text(slide, num, xbase+0.05, ypos+0.08, 0.45, 0.52,
font_size=13, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_text(slide, topic, xbase+0.65, ypos+0.1, 5.3, 0.52,
font_size=12.5, color=TEXT_DARK)
# ══════════════════════════════════════════════════════════════════
# SLIDE 3 — DEFINITION & EPIDEMIOLOGY
# ══════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
slide_header(slide, "Definition & Epidemiology",
"Harrison's 22e, Ch. 56 — Fluid and Electrolyte Disorders")
# Definition
add_rect(slide, 0.4, 1.1, 12.5, 0.95, fill_rgb=MED_BLUE)
add_text(slide, "DEFINITION: Plasma Na⁺ < 135 mEq/L",
0.6, 1.17, 8, 0.45, font_size=18, bold=True, color=WHITE)
add_text(slide, "Severe: Na⁺ < 125 mEq/L | Critical: Na⁺ < 115 mEq/L",
0.6, 1.62, 10, 0.38, font_size=13, italic=True, color=ACCENT)
# 4 stat boxes
stat_data = [
("Up to 22%", "of hospitalized\npatients affected", MED_BLUE),
("Most Common", "electrolyte disorder\nin clinical practice", GREEN),
("2–3× Higher", "mortality in hyponatremic\nvs normonatremic patients", RED),
("30–40%", "of ICU patients have\nsome degree of hyponatremia", ORANGE),
]
for i, (val, label, col) in enumerate(stat_data):
xp = 0.4 + i * 3.15
add_rect(slide, xp, 2.2, 3.0, 1.6, fill_rgb=WHITE, line_rgb=col, line_width=2)
add_rect(slide, xp, 2.2, 3.0, 0.55, fill_rgb=col)
add_text(slide, val, xp+0.05, 2.23, 2.85, 0.5,
font_size=18, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_text(slide, label, xp+0.05, 2.78, 2.85, 0.95,
font_size=11, color=TEXT_DARK, align=PP_ALIGN.CENTER, wrap=True)
# Classification strip
add_rect(slide, 0.4, 4.0, 12.5, 0.5, fill_rgb=DARK_BLUE)
add_text(slide, "PRIMARY CLASSIFICATION: By Serum Osmolality → Volume Status → Urine Electrolytes",
0.6, 4.05, 12, 0.42, font_size=13, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
osm_cols = [
("Hypotonic Hyponatremia\nSerum Osm < 280 mOsm/kg",
"TRUE hyponatremia — excess water\nrelative to Na⁺. Most clinically\nrelevant form. Further divided by\nvolume status.", BLUEL, MED_BLUE),
("Isotonic Hyponatremia\nSerum Osm 280–295 mOsm/kg",
"Pseudohyponatremia: lab artefact.\nCauses: severe hyperlipidemia,\nhyperproteinemia (myeloma).\nNormal true Na⁺ — no treatment.", GREENL, GREEN),
("Hypertonic Hyponatremia\nSerum Osm > 295 mOsm/kg",
"Translocational: osmotically active\nsolutes draw water from cells.\nCauses: hyperglycemia, mannitol,\nsorbitol, contrast media.", PEACH, RED),
]
for i, (title, desc, bg, col) in enumerate(osm_cols):
xp = 0.4 + i * 4.3
add_rect(slide, xp, 4.6, 4.1, 2.55, fill_rgb=bg, line_rgb=col, line_width=1.5)
add_text(slide, title, xp+0.1, 4.65, 3.85, 0.65,
font_size=12, bold=True, color=col)
add_text(slide, desc, xp+0.1, 5.32, 3.85, 1.75,
font_size=11, color=TEXT_DARK, wrap=True)
# ══════════════════════════════════════════════════════════════════
# SLIDE 4 — NORMAL PHYSIOLOGY
# ══════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
slide_header(slide, "Normal Sodium & Water Physiology",
"Harrison's 22e, Ch. 56 — AVP and Renal Tubular Physiology")
# AVP mechanism
add_rect(slide, 0.4, 1.1, 7.8, 5.9, fill_rgb=WHITE, line_rgb=MED_BLUE, line_width=1.5)
add_rect(slide, 0.4, 1.1, 7.8, 0.48, fill_rgb=MED_BLUE)
add_text(slide, "AVP (Vasopressin / ADH) — Mechanism of Action", 0.5, 1.12, 7.6, 0.43,
font_size=13.5, bold=True, color=WHITE)
add_bullets(slide, [
"Synthesis & Storage:",
" • Synthesized in supraoptic (SON) & paraventricular nuclei (PVN) of hypothalamus",
" • Stored and released from posterior pituitary (neurohypophysis)",
"",
"Stimuli for AVP Release:",
" • ↑ Plasma osmolality > 280–285 mOsm/kg (primary, via osmoreceptors)",
" • Hypovolemia / hypotension (via baroreceptors — overrides osmotic signal)",
" • Nausea, pain, hypoxia, stress, glucocorticoid deficiency",
" • Drugs: morphine, antidepressants, carbamazepine, NSAIDs",
"",
"Renal Action (Harrison's 22e, Fig. 56-3):",
" • AVP binds V2R on basolateral membrane of collecting duct principal cells",
" • Activates adenylyl cyclase → ↑ cAMP → activates PKA",
" • Inserts AQP2 water channels into luminal membrane",
" • AQP3 / AQP4 on basolateral membrane complete transcellular water pathway",
" • Net: ↑ water reabsorption → concentrated urine → dilutes plasma Na⁺",
], 0.5, 1.63, 7.5, 5.3, font_size=11, color=TEXT_DARK, bold_idx=[0, 4, 9])
# Right panel — tubular Na handling
add_rect(slide, 8.5, 1.1, 4.5, 5.9, fill_rgb=BLUEL, line_rgb=TEAL_D, line_width=1.5)
add_rect(slide, 8.5, 1.1, 4.5, 0.48, fill_rgb=TEAL_D)
add_text(slide, "Renal Tubular Na⁺ Handling", 8.6, 1.12, 4.3, 0.43,
font_size=13, bold=True, color=WHITE)
add_bullets(slide, [
"Normal plasma Na⁺: 136–145 mEq/L",
"Normal plasma Osm: 280–295 mOsm/kg",
"",
"Tubular Reabsorption:",
"• PCT: ~65% of filtered Na⁺",
"• TALH: ~25% (NKCC2 cotransporter)",
" → furosemide-sensitive",
"• DCT: 5–10% (NCC cotransporter)",
" → thiazide-sensitive",
"• CD: fine-tuning via ENaC + aldosterone",
"",
"Free Water Excretion:",
"• Minimum urine Osm = 50 mOsm/kg",
"• Maximum dilution requires:",
" ① Normal GFR",
" ② TALH function (diluting segment)",
" ③ Suppressed AVP",
"",
"Urine-to-plasma electrolyte ratio:",
" (U_Na + U_K) / P_Na",
" → Predicts free water excretion capacity",
], 8.6, 1.62, 4.3, 5.35, font_size=10.5, color=TEXT_DARK, bold_idx=[3, 11, 17])
# ══════════════════════════════════════════════════════════════════
# SLIDE 5 — CLASSIFICATION & PATHOPHYSIOLOGY
# ══════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
slide_header(slide, "Classification & Pathophysiology",
"Harrison's 22e, Ch. 56 — Fig. 56-5 Classification of Hyponatremia")
add_rect(slide, 0.4, 1.1, 12.5, 0.5, fill_rgb=MED_BLUE)
add_text(slide, "TRUE (HYPOTONIC) HYPONATREMIA — Classified by Extracellular Fluid Volume (ECFV)",
0.6, 1.16, 12, 0.4, font_size=13, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
# Three columns
col_data = [
("HYPOVOLEMIC\n(Na⁺ deficit > H₂O deficit)", ORANGE, PEACH, [
"Pathophysiology:",
"• Depletion of Na⁺-Cl⁻ → ↓ ECFV",
"• Baroreceptor activation → ↑ AVP",
"• AVP preserves BP (V1A receptors)",
"• AVP → water retention (V2 receptors)",
"• Relative water excess → hyponatremia",
"",
"Key Features:",
"• Reduced skin turgor, dry mucosa",
"• Postural hypotension, tachycardia",
"• Reduced JVP, low urine output",
"• Urine Na⁺ < 20 (extrarenal) or",
" > 20 (renal losses)",
"• BUN/Cr ratio > 20",
]),
("EUVOLEMIC\n(H₂O excess, normal Na⁺)", MED_BLUE, BLUEL, [
"Pathophysiology:",
"• Inappropriate persistent AVP activity",
"• Despite normal/low plasma osmolality",
"• Water retained → Na⁺ diluted",
"• Normal Na⁺ intake continues",
"• Net result: pure dilutional state",
"",
"Key Features:",
"• No oedema, no dehydration",
"• Urine Na⁺ > 40 mEq/L",
"• Urine Osm > 100 mOsm/kg",
"• Plasma Osm < 275 mOsm/kg",
"• Low serum uric acid (< 4 mg/dL)",
"• Normal renal, thyroid, adrenal function",
]),
("HYPERVOLEMIC\n(Na⁺ + H₂O both excess)", GREEN, GREENL, [
"Pathophysiology:",
"• Arterial underfilling despite ↑ total Na⁺",
"• CHF: ↓ CO → baroreceptor unloading",
"• Cirrhosis: splanchnic vasodilation",
"• ↑ RAAS + ↑ AVP + ↑ SNS activation",
"• Water retention > Na⁺ retention",
"",
"Key Features:",
"• Peripheral oedema, ascites",
"• Raised JVP (CHF) or low (cirrhosis)",
"• Urine Na⁺ < 20 mEq/L (usual)",
"• BNP elevated in CHF",
"• Albumin low in cirrhosis/nephrotic",
"• Effective circulating volume ↓",
]),
]
for i, (title, hcol, bg, items) in enumerate(col_data):
xp = 0.4 + i * 4.3
section_box(slide, title, items, xp, 1.7, 4.1, 5.65, hcol, bg, font_size=11)
add_text(slide,
"Key concept (Harrison's 22e): Absolute plasma Na⁺ value reveals NOTHING about volume status — volume assessment is mandatory",
0.5, 7.22, 12.3, 0.25, font_size=9.5, italic=True, color=TEXT_GREY)
# ══════════════════════════════════════════════════════════════════
# SLIDE 6 — ETIOLOGY (Hypovolemic & Euvolemic)
# ══════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
slide_header(slide, "Etiology — Hypovolemic & Euvolemic Hyponatremia",
"Harrison's 22e, Ch. 56 | Davidson's 24e, Ch. 16")
# Hypovolemic
add_rect(slide, 0.4, 1.1, 5.9, 5.95, fill_rgb=PEACH, line_rgb=ORANGE, line_width=1.5)
add_rect(slide, 0.4, 1.1, 5.9, 0.47, fill_rgb=ORANGE)
add_text(slide, "HYPOVOLEMIC (ECFV Depleted)", 0.52, 1.12, 5.65, 0.42, font_size=13, bold=True, color=WHITE)
add_text(slide, "Extrarenal Losses (Urine Na⁺ < 20 mEq/L):", 0.55, 1.62, 5.5, 0.3,
font_size=12, bold=True, color=ORANGE)
add_bullets(slide, [
"• GI: Vomiting, diarrhea, fistula, tube drainage",
"• Skin: Burns, excessive sweating (marathon runners)",
"• Third-space: Pancreatitis, peritonitis, crush injury",
], 0.55, 1.94, 5.5, 0.85, font_size=11.5)
add_text(slide, "Renal Losses (Urine Na⁺ > 20 mEq/L):", 0.55, 2.83, 5.5, 0.3,
font_size=12, bold=True, color=ORANGE)
add_bullets(slide, [
"• Thiazide diuretics ← most common drug cause",
" (blocks DCT NCC → volume depletion + ↑ AVP)",
"• Primary adrenal insufficiency / mineralocorticoid deficiency",
" (Addison's: Na⁺ low + K⁺ high + hypotension → suspect!)",
"• Cerebral salt wasting (post-SAH, head trauma)",
"• Salt-losing nephropathies (medullary cystic disease,",
" reflux nephropathy, post-ATN recovery, interstitial nephritis)",
"• Osmotic diuresis (glucose, urea, mannitol)",
"• Ketonuria (starvation, DKA)",
], 0.55, 3.15, 5.5, 2.6, font_size=11, color=TEXT_DARK)
add_rect(slide, 0.5, 5.82, 5.55, 0.45, fill_rgb=YELLOW_BG, line_rgb=ORANGE, line_width=1)
add_text(slide, "Pearls: Urine Na⁺ < 20 → rapid correction with IV saline as AVP suppresses\n"
"Thiazide patients may appear euvolemic — only low urine Na⁺ betrays hypovolemia",
0.6, 5.85, 5.35, 0.4, font_size=9.5, italic=True, color=ORANGE, wrap=True)
# Euvolemic
add_rect(slide, 6.65, 1.1, 6.3, 5.95, fill_rgb=BLUEL, line_rgb=MED_BLUE, line_width=1.5)
add_rect(slide, 6.65, 1.1, 6.3, 0.47, fill_rgb=MED_BLUE)
add_text(slide, "EUVOLEMIC (SIAD + Others)", 6.77, 1.12, 6.0, 0.42, font_size=13, bold=True, color=WHITE)
add_text(slide, "SIAD — CNS Causes:", 6.75, 1.62, 6.05, 0.3, font_size=12, bold=True, color=MED_BLUE)
add_bullets(slide, [
"• Meningitis, encephalitis, cerebral abscess",
"• Stroke (ischaemic & haemorrhagic), SAH, TBI",
"• Brain tumours, hydrocephalus, psychosis",
], 6.75, 1.94, 6.05, 0.75, font_size=11)
add_text(slide, "SIAD — Pulmonary Causes:", 6.75, 2.73, 6.05, 0.3, font_size=12, bold=True, color=MED_BLUE)
add_bullets(slide, [
"• Community-acquired pneumonia, TB, lung abscess",
"• ARDS, pneumothorax, mechanical ventilation",
"• Respiratory failure, pleural empyema",
], 6.75, 3.05, 6.05, 0.75, font_size=11)
add_text(slide, "SIAD — Drugs:", 6.75, 3.84, 6.05, 0.3, font_size=12, bold=True, color=MED_BLUE)
add_bullets(slide, [
"• Antidepressants: SSRIs, SNRIs, TCAs, MAOIs",
"• Antiepileptics: Carbamazepine, oxcarbazepine",
"• Antineoplastics: Cyclophosphamide, vincristine, cisplatin",
"• Others: NSAIDs, opioids, desmopressin, chlorpropamide",
], 6.75, 4.16, 6.05, 1.0, font_size=11)
add_text(slide, "Other Euvolemic Causes:", 6.75, 5.2, 6.05, 0.3, font_size=12, bold=True, color=MED_BLUE)
add_bullets(slide, [
"• Hypothyroidism (impairs free water excretion)",
"• Secondary adrenal insufficiency (ACTH deficiency — CRH/ACTH axis)",
"• Low solute intake: beer potomania, 'tea and toast' diet",
"• Psychogenic polydipsia (very high water intake overwhelms dilution)",
], 6.75, 5.52, 6.05, 1.35, font_size=11)
# ══════════════════════════════════════════════════════════════════
# SLIDE 7 — HYPERVOLEMIC ETIOLOGY + TABLE COMPARISON
# ══════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
slide_header(slide, "Etiology — Hypervolemic Hyponatremia & Comparative Overview",
"Harrison's 22e, Ch. 56 | Davidson's 24e, Ch. 16")
# Hypervolemic panel
add_rect(slide, 0.4, 1.1, 5.9, 4.1, fill_rgb=GREENL, line_rgb=GREEN, line_width=1.5)
add_rect(slide, 0.4, 1.1, 5.9, 0.47, fill_rgb=GREEN)
add_text(slide, "HYPERVOLEMIC (Oedematous States)", 0.52, 1.12, 5.65, 0.42, font_size=13, bold=True, color=WHITE)
add_bullets(slide, [
"Congestive Heart Failure:",
" • ↓ Cardiac output → baroreceptor unloading",
" • ↑ AVP + ↑ RAAS + ↑ SNS → avid Na⁺/H₂O retention",
" • H₂O retention exceeds Na⁺ retention → dilution",
" • Responds to optimised heart failure therapy (ACEi/ARB, BB)",
"",
"Hepatic Cirrhosis:",
" • Splanchnic vasodilation (↑ NO) → 'effective' arterial underfilling",
" • ↑ Aldosterone (secondary hyperaldosteronism)",
" • ↑ AVP despite low osmolality",
" • Refractory hyponatremia = poor prognosis (MELD score ↑)",
"",
"Nephrotic Syndrome:",
" • Protein loss → ↓ oncotic pressure → oedema",
" • Reduced effective circulating volume → AVP stimulation",
"",
"Chronic Kidney Disease (Advanced):",
" • Impaired ability to dilute or excrete free water",
" • GFR < 15–20 mL/min particularly affected",
], 0.52, 1.6, 5.65, 3.5, font_size=11, color=TEXT_DARK, bold_idx=[0, 6, 12, 15])
# Comparison table
add_rect(slide, 6.6, 1.1, 6.4, 4.1, fill_rgb=WHITE, line_rgb=DARK_BLUE, line_width=1)
add_rect(slide, 6.6, 1.1, 6.4, 0.47, fill_rgb=DARK_BLUE)
add_text(slide, "Diagnostic Comparison at a Glance", 6.7, 1.12, 6.15, 0.42,
font_size=13, bold=True, color=WHITE)
headers = ["Feature", "Hypovolemic", "Euvolemic", "Hypervolemic"]
h_cols = [DARK_BLUE, ORANGE, MED_BLUE, GREEN]
col_xs = [6.65, 8.0, 9.7, 11.4]
col_ws = [1.3, 1.65, 1.65, 1.55]
# header row
for j, (hdr, hc, cw, cx) in enumerate(zip(headers, h_cols, col_ws, col_xs)):
add_rect(slide, cx, 1.6, cw, 0.38, fill_rgb=hc)
add_text(slide, hdr, cx+0.04, 1.63, cw-0.06, 0.33, font_size=10, bold=True,
color=WHITE, align=PP_ALIGN.CENTER)
rows_data = [
("ECFV", "↓", "Normal", "↑"),
("Urine Na⁺", "< 20 / > 20"," > 40", "< 20"),
("Urine Osm", "> 400", " > 100", "Variable"),
("BUN/Cr", "> 20", " Low", "Variable"),
("Serum UA", "Normal/↑", " Low", "Normal"),
("Oedema", "Absent", " Absent", "Present"),
("Clinical", "Dehydrated", " No signs", "Oedematous"),
("Response\nto NS", "↑ Na⁺ quickly", "No change", "Worsens"),
]
for ri, row in enumerate(rows_data):
y = 2.0 + ri * 0.38
bg = WHITE if ri % 2 == 0 else LIGHT_BG
for j, (val, cw, cx) in enumerate(zip(row, col_ws, col_xs)):
add_rect(slide, cx, y, cw, 0.38, fill_rgb=bg,
line_rgb=RGBColor(0xCC, 0xDD, 0xEE), line_width=0.5)
add_text(slide, val, cx+0.04, y+0.02, cw-0.07, 0.34, font_size=9.5,
color=TEXT_DARK, align=PP_ALIGN.CENTER, wrap=True)
# Bottom boxes
add_rect(slide, 0.4, 5.3, 5.9, 1.75, fill_rgb=WHITE, line_rgb=GREEN, line_width=1)
add_text(slide, "Davidson's 24e Clinical Note on Hypervolemic Hyponatremia:",
0.55, 5.35, 5.7, 0.3, font_size=11, bold=True, color=GREEN)
add_bullets(slide, [
"• The hyponatraemia of heart failure and cirrhosis carries independent prognostic significance",
"• Serum Na⁺ < 130 mEq/L in CHF correlates with BNP elevation and poor cardiac output",
"• In cirrhosis, hyponatraemia predicts hepatic encephalopathy and 90-day mortality",
"• Target correction: 4–6 mEq/L/24 h; aggressive correction can precipitate pontine myelinolysis",
], 0.55, 5.68, 5.7, 1.3, font_size=10.5, color=TEXT_DARK)
add_rect(slide, 6.6, 5.3, 6.4, 1.75, fill_rgb=YELLOW_BG, line_rgb=ORANGE, line_width=1)
add_text(slide, "NS = normal saline | UA = uric acid | Osm = osmolality\n"
"CSW (Cerebral Salt Wasting): hyponatremia + hypovolemia in CNS disease —\n"
"differentiate from SIAD: both have high urine Na⁺ but CSW has low ECFV;\n"
"CSW requires saline replacement, SIAD requires fluid restriction",
6.7, 5.35, 6.2, 1.65, font_size=10, italic=True, color=TEXT_DARK, wrap=True)
# ══════════════════════════════════════════════════════════════════
# SLIDE 8 — SIAD IN DEPTH
# ══════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
slide_header(slide, "SIAD — Diagnostic Criteria, Subtypes & Cancer",
"Harrison's 22e, Ch. 56 & Ch. 98 (Endocrine Paraneoplastic Syndromes)")
# Left — diagnostic criteria
add_rect(slide, 0.4, 1.1, 6.0, 5.9, fill_rgb=BLUEL, line_rgb=MED_BLUE, line_width=1.5)
add_rect(slide, 0.4, 1.1, 6.0, 0.47, fill_rgb=MED_BLUE)
add_text(slide, "SIAD Diagnostic Criteria (Bartter & Schwartz)", 0.52, 1.12, 5.75, 0.42,
font_size=13, bold=True, color=WHITE)
add_text(slide, "Essential Criteria (ALL must be met):", 0.55, 1.62, 5.7, 0.3,
font_size=12, bold=True, color=MED_BLUE)
add_bullets(slide, [
"✓ Plasma osmolality < 275 mOsm/kg (hypotonic)",
"✓ Urine osmolality > 100 mOsm/kg (inappropriately concentrated)",
"✓ Clinical euvolemia — no hypovolaemia or oedema",
"✓ Urine Na⁺ > 40 mEq/L on normal Na⁺ intake",
"✓ Normal renal, thyroid (TSH), adrenal (cortisol) function",
"✓ No recent diuretic use",
], 0.55, 1.95, 5.7, 1.55, font_size=11.5)
add_text(slide, "Supplemental Criteria:", 0.55, 3.55, 5.7, 0.3,
font_size=12, bold=True, color=MED_BLUE)
add_bullets(slide, [
"• Serum uric acid < 4 mg/dL (hypouricaemia)",
"• BUN < 10 mg/dL (low uraemia)",
"• Fractional excretion of Na⁺ (FENa) > 1%",
"• Fractional excretion of uric acid (FEUA) > 12%",
"• Failure to correct with isotonic saline infusion",
"• Correction with fluid restriction confirms diagnosis",
"• Response to hypertonic saline resolves acutely",
], 0.55, 3.88, 5.7, 1.75, font_size=11.5)
add_rect(slide, 0.5, 5.7, 5.7, 0.55, fill_rgb=BLUEL, line_rgb=MED_BLUE, line_width=1)
add_text(slide, "SIAD = diagnosis of exclusion — always rule out hypothyroidism and adrenal\n"
"insufficiency first; both can closely mimic SIAD clinically",
0.6, 5.73, 5.5, 0.5, font_size=10.5, italic=True, color=MED_BLUE, wrap=True)
# Right — subtypes & cancer
add_rect(slide, 6.75, 1.1, 6.2, 5.9, fill_rgb=PURPLEL, line_rgb=PURPLE, line_width=1.5)
add_rect(slide, 6.75, 1.1, 6.2, 0.47, fill_rgb=PURPLE)
add_text(slide, "SIAD Subtypes & Ectopic AVP (Tumours)", 6.87, 1.12, 5.95, 0.42,
font_size=13, bold=True, color=WHITE)
add_text(slide, "4 Subtypes of AVP Secretion Pattern:", 6.88, 1.62, 5.9, 0.3,
font_size=12, bold=True, color=PURPLE)
add_bullets(slide, [
"Type A (40%): Erratic/random AVP secretion regardless of Osm",
"Type B (30%): 'Reset osmostat' — lower set point for AVP release",
"Type C (20%): Constant basal AVP leak with normal response above",
"Type D (<10%): Normal AVP but enhanced V2R sensitivity (gain-of-function mutation)",
], 6.88, 1.95, 5.9, 1.05, font_size=11, color=TEXT_DARK)
add_text(slide, "Ectopic AVP — Tumour-Associated SIAD (Harrison's 22e, Ch. 98):", 6.88, 3.05, 5.9, 0.3,
font_size=12, bold=True, color=PURPLE)
add_bullets(slide, [
"• SIAD = most common paraneoplastic electrolyte disorder",
"• Small cell lung cancer (SCLC): #1 cause — 10–15% of SCLC",
"• Carcinoid tumours (pulmonary, GI)",
"• Head & neck cancers, oesophageal cancer",
"• Lymphoma (Hodgkin & NHL), thymoma",
"• CNS tumours (primary and secondary)",
"• Leukaemias, pancreatic and duodenal tumours",
"",
"Mechanism: Tumour cells express AVP gene and",
" secrete AVP independent of osmotic regulation",
"",
"Clue: SIAD in a smoker with weight loss → urgent CT thorax",
"Treatment: Treat the malignancy first; vaptan if refractory",
], 6.88, 3.38, 5.9, 3.45, font_size=11, color=TEXT_DARK, bold_idx=[1])
# ══════════════════════════════════════════════════════════════════
# SLIDE 9 — CLINICAL FEATURES
# ══════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
slide_header(slide, "Clinical Features of Hyponatremia",
"Harrison's 22e, Ch. 56 — Table 56-2 | Davidson's 24e, Ch. 16")
add_rect(slide, 0.4, 1.1, 12.5, 0.55, fill_rgb=MED_BLUE)
add_text(slide, "Severity of symptoms = f(rate of fall in Na⁺) AND f(absolute Na⁺ level)",
0.6, 1.15, 12, 0.45, font_size=14, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
# Acute vs Chronic
add_rect(slide, 0.4, 1.75, 6.0, 3.5, fill_rgb=PEACH, line_rgb=RED, line_width=1.5)
add_rect(slide, 0.4, 1.75, 6.0, 0.47, fill_rgb=RED)
add_text(slide, "ACUTE Hyponatremia (< 48 hours)", 0.52, 1.77, 5.75, 0.42, font_size=13, bold=True, color=WHITE)
add_bullets(slide, [
"• Brain has NO time to adapt → cerebral oedema",
"• Osmolyte extrusion has not occurred",
"• Symptoms appear even at 125–130 mEq/L",
"",
"Mild: Headache, nausea, vomiting, malaise",
"Moderate: Confusion, disorientation, somnolence",
"Severe: Seizures, respiratory arrest, cerebral herniation",
"",
"Acute hyponatremia in premenopausal women:",
" • Oestrogen impairs brain adaptation to osmotic stress",
" • Higher risk of severe neurological complications",
" • E.g., postoperative hyponatremia after hypotonic IVF",
], 0.52, 2.25, 5.7, 2.9, font_size=11.5, color=TEXT_DARK, bold_idx=[4, 5, 6, 8])
add_rect(slide, 6.75, 1.75, 6.2, 3.5, fill_rgb=BLUEL, line_rgb=MED_BLUE, line_width=1.5)
add_rect(slide, 6.75, 1.75, 6.2, 0.47, fill_rgb=MED_BLUE)
add_text(slide, "CHRONIC Hyponatremia (> 48 hours)", 6.87, 1.77, 5.9, 0.42, font_size=13, bold=True, color=WHITE)
add_bullets(slide, [
"• Brain adapts: Extrudes organic osmolytes",
" (glutamine, myoinositol, taurine, GABA)",
"• Reduces cellular swelling over 48–72 h",
"• Symptoms milder at same absolute Na⁺",
"",
"Mild (often overlooked):",
" Nausea, fatigue, cognitive slowing",
"Significant: Gait unsteadiness, falls",
" • 3-fold ↑ risk of falls & hip fractures",
" • Impaired attention and working memory",
"Severe: Seizures, coma (usually Na⁺ < 115)",
"",
"Risk of ODS if corrected too rapidly!",
"(Brain has depleted osmolytes — can't recover quickly)",
], 6.87, 2.25, 5.9, 2.9, font_size=11.5, color=TEXT_DARK, bold_idx=[5, 7, 10, 12])
# Spectrum bar
add_rect(slide, 0.4, 5.35, 12.5, 0.4, fill_rgb=DARK_BLUE)
add_text(slide, "SYMPTOM SPECTRUM BY PLASMA Na⁺",
0.6, 5.38, 12, 0.35, font_size=13, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
levels = [
("Na⁺ 131–135", "Often\nasymptomatic", GREENL, GREEN),
("Na⁺ 126–130", "Nausea,\nheadache", BLUEL, MED_BLUE),
("Na⁺ 121–125", "Confusion,\nvomiting", YELLOW_BG, ORANGE),
("Na⁺ 116–120", "Seizures,\nobtundation", PEACH, RED),
("Na⁺ < 115", "Coma, herniation,\nrespiratory arrest", RGBColor(0xFF,0xCC,0xCC), RED),
]
for i, (level, sym, bg, col) in enumerate(levels):
xp = 0.4 + i * 2.5
add_rect(slide, xp, 5.8, 2.4, 1.55, fill_rgb=bg, line_rgb=col, line_width=1.5)
add_text(slide, level, xp+0.05, 5.83, 2.3, 0.42, font_size=12, bold=True,
color=col, align=PP_ALIGN.CENTER)
add_text(slide, sym, xp+0.05, 6.28, 2.3, 1.0, font_size=11, color=TEXT_DARK,
align=PP_ALIGN.CENTER, wrap=True)
# ══════════════════════════════════════════════════════════════════
# SLIDE 10 — INVESTIGATIONS
# ══════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
slide_header(slide, "Investigations — Step-by-Step Workup",
"Harrison's 22e, Ch. 56 | Davidson's 24e, Ch. 16")
# Step boxes
steps = [
("STEP 1\nFirst-line Bloods", MED_BLUE, BLUEL, [
"Serum electrolytes (Na, K, Cl, HCO₃)",
"Serum osmolality (measured)",
"Urea / BUN, Creatinine, eGFR",
"Random blood glucose",
"Serum uric acid",
"Serum proteins (albumin, total protein)",
"TFTs: TSH (rule out hypothyroidism)",
"9 AM cortisol / short Synacthen test",
" (rule out adrenal insufficiency)",
"LFTs (cirrhosis), BNP / pro-BNP (CHF)",
]),
("STEP 2\nUrine Studies", TEAL_D, RGBColor(0xE0, 0xF5, 0xFA), [
"Spot urine sodium (mEq/L)",
" < 20 → hypovolemic or hypervolemic",
" > 40 → SIAD, diuretics, adrenal AI",
"Spot urine potassium (mEq/L)",
"Urine osmolality (mOsm/kg)",
" < 100 → psychogenic polydipsia",
" > 100 → SIAD or appropriate AVP",
"Urine Cr (for FENa, FEUA calculation)",
"Urine-to-plasma (U:P) ratio:",
" (U_Na + U_K) / P_Na",
" > 1 → restrict fluids < 500 mL/day",
]),
("STEP 3\nSpecific Tests", PURPLE, PURPLEL, [
"Plasma AVP / ADH level (rarely needed)",
"FENa = (U_Na × P_Cr) / (P_Na × U_Cr) × 100",
"FEUA = (U_UA × P_Cr) / (P_UA × U_Cr) × 100",
" > 12% supports SIAD",
"Serum lipids (pseudohyponatremia)",
"Serum protein electrophoresis (myeloma)",
"Plasma renin + aldosterone (adrenal AI)",
"CT chest/abdomen (malignancy if SIAD)",
"MRI brain (CNS disease if SIAD)",
"Bone marrow (if haematological malignancy)",
]),
]
for i, (title, hcol, bg, items) in enumerate(steps):
xp = 0.4 + i * 4.3
section_box(slide, title, items, xp, 1.1, 4.1, 5.9, hcol, bg, font_size=11)
add_text(slide,
"Adrogue-Madias formula (used to estimate effect of 1L infusate on plasma Na⁺): ΔNa⁺ = (Infusate Na⁺ – Plasma Na⁺) ÷ (Total Body Water + 1L) | TBW = 0.6 × weight (male), 0.5 × weight (female), 0.45 × weight (elderly)",
0.5, 7.22, 12.3, 0.25, font_size=9.5, italic=True, color=TEXT_GREY)
# ══════════════════════════════════════════════════════════════════
# SLIDE 11 — DIAGNOSTIC ALGORITHM (Flowchart style)
# ══════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
slide_header(slide, "Diagnostic Algorithm — Step-by-Step Approach",
"Harrison's 22e, Ch. 56 — Fig. 56-5 | Davidson's 24e, Ch. 16")
# Top box
add_rect(slide, 4.2, 1.1, 5.0, 0.6, fill_rgb=DARK_BLUE)
add_text(slide, "Plasma Na⁺ < 135 mEq/L", 4.25, 1.13, 4.85, 0.52,
font_size=14, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
# Arrow down
add_rect(slide, 6.57, 1.7, 0.2, 0.35, fill_rgb=DARK_BLUE)
# Osmolality row
add_rect(slide, 0.4, 2.05, 3.3, 0.65, fill_rgb=GREENL, line_rgb=GREEN, line_width=1.5)
add_text(slide, "Isotonic / Hypertonic\nOsm ≥ 280", 0.45, 2.07, 3.2, 0.6,
font_size=11.5, bold=True, color=GREEN, align=PP_ALIGN.CENTER)
add_text(slide, "Pseudo / Translocational\n(no Rx needed for Na⁺)", 0.45, 2.72, 3.2, 0.6,
font_size=10.5, italic=True, color=TEXT_DARK, align=PP_ALIGN.CENTER)
add_rect(slide, 5.05, 2.05, 3.25, 0.65, fill_rgb=BLUEL, line_rgb=MED_BLUE, line_width=2)
add_text(slide, "Hypotonic\nOsm < 280 mOsm/kg", 5.1, 2.07, 3.15, 0.6,
font_size=12, bold=True, color=MED_BLUE, align=PP_ALIGN.CENTER)
add_rect(slide, 9.6, 2.05, 3.3, 0.65, fill_rgb=PEACH, line_rgb=RED, line_width=1.5)
add_text(slide, "Urine Osm < 100\nPolydipsia / Low Solute", 9.65, 2.07, 3.2, 0.6,
font_size=11.5, bold=True, color=RED, align=PP_ALIGN.CENTER)
add_text(slide, "Serum Osmolality", 3.75, 2.07, 1.2, 0.6,
font_size=11, bold=True, color=DARK_BLUE, align=PP_ALIGN.CENTER)
# Arrow from hypotonic
add_rect(slide, 6.57, 2.7, 0.2, 0.4, fill_rgb=MED_BLUE)
# Volume status row
add_rect(slide, 0.4, 3.1, 12.5, 0.45, fill_rgb=MED_BLUE)
add_text(slide, "↓ Assess Volume Status (Clinical Exam + Urine Na⁺ + Urine Osm) ↓",
0.6, 3.15, 12, 0.38, font_size=13, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
# Three volume boxes
vol_data = [
("HYPOVOLEMIC\n(↓ ECFV)", ORANGE, PEACH,
"Urine Na⁺\n< 20 mEq/L",
"Extrarenal: GI loss,\nBurns, Sweating",
"Urine Na⁺\n> 20 mEq/L",
"Renal: Thiazide,\nAdrenal insuff, CSW"),
("EUVOLEMIC\n(Normal ECFV)", MED_BLUE, BLUEL,
"Urine Osm\n< 100 mOsm/kg",
"Polydipsia /\nLow solute intake",
"Urine Na⁺\n> 40 mEq/L",
"SIAD / Hypothyroid /\n2° Adrenal insuff"),
("HYPERVOLEMIC\n(↑ ECFV)", GREEN, GREENL,
"Urine Na⁺\n< 20 mEq/L",
"CHF / Cirrhosis /\nNephrotic syndrome",
"Urine Na⁺\n> 20 mEq/L",
"CKD / Diuretics +\nedematous state"),
]
for i, (vtitle, hcol, bg, u1, c1, u2, c2) in enumerate(vol_data):
xp = 0.4 + i * 4.3
# header
add_rect(slide, xp, 3.6, 4.1, 0.65, fill_rgb=hcol)
add_text(slide, vtitle, xp+0.05, 3.62, 3.95, 0.6,
font_size=13, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
# urine 1
add_rect(slide, xp, 4.3, 1.9, 0.55, fill_rgb=bg, line_rgb=hcol, line_width=1)
add_text(slide, u1, xp+0.05, 4.33, 1.8, 0.5,
font_size=10.5, bold=True, color=hcol, align=PP_ALIGN.CENTER)
add_rect(slide, xp, 4.88, 1.9, 0.7, fill_rgb=WHITE, line_rgb=hcol, line_width=0.8)
add_text(slide, c1, xp+0.05, 4.9, 1.8, 0.65,
font_size=10.5, color=TEXT_DARK, align=PP_ALIGN.CENTER, wrap=True)
# urine 2
add_rect(slide, xp+2.15, 4.3, 1.9, 0.55, fill_rgb=bg, line_rgb=hcol, line_width=1)
add_text(slide, u2, xp+2.2, 4.33, 1.8, 0.5,
font_size=10.5, bold=True, color=hcol, align=PP_ALIGN.CENTER)
add_rect(slide, xp+2.15, 4.88, 1.9, 0.7, fill_rgb=WHITE, line_rgb=hcol, line_width=0.8)
add_text(slide, c2, xp+2.2, 4.9, 1.8, 0.65,
font_size=10.5, color=TEXT_DARK, align=PP_ALIGN.CENTER, wrap=True)
# Treatment arrows
tx_data = [
(0.4, "Rx: Isotonic saline\n(0.9% NaCl)", ORANGE),
(4.7, "Rx: Fluid restriction\n± Urea / Tolvaptan", MED_BLUE),
(9.0, "Rx: Treat cause\n± Loop diuretic / Vaptan", GREEN),
]
for xp, txt, col in tx_data:
add_rect(slide, xp, 5.65, 4.0, 0.65, fill_rgb=col)
add_text(slide, txt, xp+0.1, 5.67, 3.8, 0.6,
font_size=12, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_text(slide, "CSW = Cerebral Salt Wasting | ECFV = Extracellular Fluid Volume | Rx = Treatment",
0.5, 7.28, 12, 0.22, font_size=9, italic=True, color=TEXT_GREY)
# ══════════════════════════════════════════════════════════════════
# SLIDE 12 — TREATMENT PRINCIPLES & ODS
# ══════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
slide_header(slide, "Treatment Principles & ODS Prevention",
"Harrison's 22e, Ch. 56 — Three Guiding Principles")
# Three principles
princ = [
("Principle 1", "Urgency by\nSymptom Severity",
"• Acute (< 48h): Immediate correction warranted even without severe symptoms\n"
"• Chronic (> 48h): Less urgency; aim for controlled slow correction\n"
"• Seizures / herniation: Emergency — hypertonic saline bolus now",
ORANGE, PEACH),
("Principle 2", "Safe Correction\nRate — ODS Risk",
"• Chronic: Max 8–10 mEq/L in first 24 h\n"
"• Max 18 mEq/L in first 48 h\n"
"• Ideal target: 4–8 mEq/L per 24 h (conservative)",
RED, PEACH),
("Principle 3", "Frequent\nMonitoring",
"• Response to any intervention is UNPREDICTABLE\n"
"• Check serum Na⁺ every 2–4 h during active correction\n"
"• Adjust infusion rate promptly if overcorrecting",
MED_BLUE, BLUEL),
]
for i, (num, title, desc, hcol, bg) in enumerate(princ):
xp = 0.4 + i * 4.3
add_rect(slide, xp, 1.1, 4.0, 2.2, fill_rgb=bg, line_rgb=hcol, line_width=2)
add_rect(slide, xp, 1.1, 4.0, 0.47, fill_rgb=hcol)
add_text(slide, f"{num}: {title}", xp+0.1, 1.12, 3.75, 0.42,
font_size=12.5, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_text(slide, desc, xp+0.1, 1.62, 3.75, 1.6,
font_size=11, color=TEXT_DARK, wrap=True)
# ODS
add_rect(slide, 0.4, 3.45, 6.0, 4.0, fill_rgb=PEACH, line_rgb=RED, line_width=2)
add_rect(slide, 0.4, 3.45, 6.0, 0.47, fill_rgb=RED)
add_text(slide, "⚠ Osmotic Demyelination Syndrome (ODS)", 0.52, 3.47, 5.75, 0.42,
font_size=13, bold=True, color=WHITE)
add_bullets(slide, [
"Previously: Central Pontine Myelinolysis (CPM)",
"Can also involve extrapontine sites → extrapontine myelinolysis",
"",
"Mechanism:",
" • Brain adapted to low Na⁺ by depleting organic osmolytes",
" • Rapid correction restores osmolality faster than brain can re-accumulate osmolytes",
" • Osmotic stress across myelin sheath → demyelination",
"",
"Clinical Features (appear 2–6 days after overcorrection):",
" • Dysarthria, dysphagia",
" • Paraplegia, tetraplegia",
" • 'Locked-in' syndrome — awake but unable to move",
" • Altered consciousness, coma",
"",
"Risk Factors: Alcoholism, malnutrition, hypokalemia, liver disease",
"",
"Management of Overcorrection:",
" • Stop hypertonic saline IMMEDIATELY",
" • Give D5W 3–5 mL/kg/h + DDAVP 2 mcg IV q8h",
" • Goal: Reduce Na⁺ to < 8–10 mEq/L above starting point",
], 0.52, 3.95, 5.7, 3.4, font_size=11, color=TEXT_DARK, bold_idx=[3, 8, 14, 16])
# Correction rate box
add_rect(slide, 6.75, 3.45, 6.2, 4.0, fill_rgb=BLUEL, line_rgb=MED_BLUE, line_width=1.5)
add_rect(slide, 6.75, 3.45, 6.2, 0.47, fill_rgb=MED_BLUE)
add_text(slide, "Safe Correction Rate Summary", 6.87, 3.47, 5.9, 0.42,
font_size=13, bold=True, color=WHITE)
add_bullets(slide, [
"ACUTE symptomatic hyponatremia:",
" • Target ↑ Na⁺ by 1–2 mEq/L/hour until symptoms resolve",
" • Acceptable to raise 4–6 mEq/L over 1–2 hours",
" • Then slow down",
"",
"CHRONIC hyponatremia (> 48 h):",
" • Maximum: 8–10 mEq/L per 24 h",
" • Maximum: 18 mEq/L per 48 h",
" • Ideal: 4–8 mEq/L per 24 h",
"",
"High-risk patients — be even more conservative (< 8 mEq/L/24 h):",
" • Alcoholism",
" • Malnutrition",
" • Hypokalemia (K⁺ repletion itself raises Na⁺!)",
" • Liver disease",
" • Na⁺ starting level < 105 mEq/L",
"",
"Monitor: Serum Na⁺ every 2 h during active Rx",
"Document: Starting Na⁺ + hourly rate + 24 h target",
], 6.87, 3.97, 5.9, 3.4, font_size=11, color=TEXT_DARK, bold_idx=[0, 5, 10, 17, 18])
# ══════════════════════════════════════════════════════════════════
# SLIDE 13 — TREATMENT BY VOLUME STATUS
# ══════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
slide_header(slide, "Treatment by Volume Status",
"Harrison's 22e, Ch. 56 | Davidson's 24e, Ch. 16")
col_data = [
("HYPOVOLEMIC", ORANGE, PEACH, [
"First: Identify and treat cause",
"• Stop thiazide diuretic",
"• Treat vomiting/diarrhoea",
"• Replace adrenal (hydrocortisone if AI)",
"",
"Isotonic (0.9%) Saline IV:",
"• Rapidly ↓ AVP → brisk water diuresis",
"• Corrects Na⁺ deficit and ECFV",
"• Risk of overcorrection — monitor!",
"",
"Beer potomania / Low solute:",
"• Very high ODS risk",
"• IV saline + resume normal diet",
"• Extreme caution — correct slowly",
"",
"K⁺ replacement also raises Na⁺:",
"• Account for this in target calculations",
"• Each 1 mEq K⁺ repleted ≈ 1 mEq ↑ Na⁺",
]),
("EUVOLEMIC (SIAD)", MED_BLUE, BLUEL, [
"First: Treat underlying cause",
"• Remove offending drug (SSRI, carbamazepine)",
"• Treat infection (pneumonia, meningitis)",
"• Treat malignancy (SCLC) → Na⁺ corrects",
"• Levothyroxine if hypothyroidism",
"• Hydrocortisone if 2° adrenal insufficiency",
"",
"Fluid restriction (cornerstone of chronic SIAD):",
"U:P ratio > 1 → restrict < 500 mL/day",
"U:P ratio ≈ 1 → restrict 500–700 mL/day",
"U:P ratio < 1 → restrict < 1 L/day",
"",
"Salt tablets + oral furosemide",
"• Increases daily solute excretion",
"• Enables greater free water excretion",
"",
"Oral urea: 15–60 g/day in divided doses",
"• Cheap, effective, safe long-term",
"• Bitter taste — adherence an issue",
]),
("HYPERVOLEMIC", GREEN, GREENL, [
"First: Treat underlying disease",
"• CHF: Optimise with ACEi/ARB, BB, MRA",
"• Cirrhosis: Spironolactone + furosemide",
"• Nephrotic: Treat primary renal disease",
"",
"Fluid and Na⁺ restriction:",
"• Free water restriction < 1–1.5 L/day",
"• Dietary Na⁺ restriction < 2 g/day",
"",
"Loop diuretics (furosemide):",
"• Promote electrolyte-free water excretion",
"• Combine with dietary Na⁺ restriction",
"",
"Vaptans (V2R antagonists):",
"• Tolvaptan 15–60 mg/day (oral)",
"• Selective aquaresis (water only)",
"• Approved: Euvolemic and hypervolemic",
"• AVOID: >30 days in cirrhosis (hepatotoxic)",
"• Do not use with hepatic failure",
]),
]
for i, (title, hcol, bg, items) in enumerate(col_data):
xp = 0.4 + i * 4.3
section_box(slide, title, items, xp, 1.1, 4.1, 6.35, hcol, bg, font_size=11)
# ══════════════════════════════════════════════════════════════════
# SLIDE 14 — HYPERTONIC SALINE & DRUGS
# ══════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
slide_header(slide, "Hypertonic Saline Protocol & Pharmacotherapy",
"Harrison's 22e, Ch. 56 | Davidson's 24e, Ch. 16")
# Hypertonic saline
add_rect(slide, 0.4, 1.1, 6.0, 6.35, fill_rgb=WHITE, line_rgb=RED, line_width=1.5)
add_rect(slide, 0.4, 1.1, 6.0, 0.47, fill_rgb=RED)
add_text(slide, "3% Hypertonic Saline (Na⁺ = 513 mEq/L)", 0.52, 1.12, 5.75, 0.42,
font_size=13, bold=True, color=WHITE)
add_text(slide, "Indications:", 0.55, 1.62, 5.7, 0.28, font_size=12, bold=True, color=RED)
add_bullets(slide, [
"• Acute symptomatic hyponatremia with seizures / coma",
"• Signs of cerebral herniation (Cushing's triad)",
"• Acute hyponatremia Na⁺ < 120 mEq/L regardless of symptoms",
"• Rapid neurological deterioration in any Na⁺ disorder",
], 0.55, 1.93, 5.7, 0.95, font_size=11.5)
add_text(slide, "Bolus Protocol (Severe Acute Symptoms):", 0.55, 2.92, 5.7, 0.28, font_size=12, bold=True, color=RED)
add_bullets(slide, [
"• 100–150 mL of 3% NaCl IV over 10–20 minutes",
"• Can repeat up to 3 boluses if seizures persist",
"• Expected Na⁺ rise: ~2 mEq/L per bolus",
"• Reassess after each bolus — stop when symptoms resolve",
], 0.55, 3.23, 5.7, 0.95, font_size=11.5)
add_text(slide, "Continuous Infusion (Less Urgent Correction):", 0.55, 4.22, 5.7, 0.28, font_size=12, bold=True, color=RED)
add_bullets(slide, [
"• Rate = 0.5–1 mL/kg/hour (titrate to target)",
"• Use Adrogue-Madias formula to estimate:",
" ΔNa⁺ = (Infusate Na⁺ − Plasma Na⁺) ÷ (TBW + 1)",
" TBW = 0.6 × wt (♂), 0.5 × wt (♀), 0.45 × wt (elderly)",
"",
"Example (70 kg male, Na⁺ = 118 mEq/L):",
" TBW = 0.6 × 70 = 42 L",
" ΔNa⁺ per L of 3% NaCl = (513 − 118) ÷ (42 + 1) = 9.2 mEq/L",
" → To raise by 6 mEq: give ~0.65 L (650 mL) of 3% NaCl",
"",
"• Check Na⁺ every 2 h; stop if ≥ 8–10 mEq/24 h in chronic",
"• Central line preferred; peripheral acceptable short-term",
], 0.55, 4.53, 5.7, 2.7, font_size=11.5, color=TEXT_DARK, bold_idx=[5])
# Pharmacotherapy
add_rect(slide, 6.75, 1.1, 6.2, 6.35, fill_rgb=WHITE, line_rgb=MED_BLUE, line_width=1.5)
add_rect(slide, 6.75, 1.1, 6.2, 0.47, fill_rgb=MED_BLUE)
add_text(slide, "Pharmacological Therapy for Chronic SIAD", 6.87, 1.12, 5.9, 0.42,
font_size=13, bold=True, color=WHITE)
drug_data = [
("Vaptans — V2 Receptor Antagonists", MED_BLUE, [
"Mechanism: Block AVP's V2R → 'aquaresis' (pure water excretion)",
"Tolvaptan (oral):",
" • Dose: 15 mg/day, titrate to 30–60 mg/day",
" • FDA approved: Euvolemic + hypervolemic hyponatremia",
" • Onset: within hours; effective in SIAD, CHF",
" • AVOID: Liver disease, > 30 days in cirrhosis (hepatotoxic)",
" • DO NOT initiate in hospital — risk of rapid overcorrection",
"Conivaptan (IV):",
" • Used in hospital (CHF, SIAD)",
" • 20 mg IV load, then 20–40 mg/day infusion",
]),
("Demeclocycline (Tetracycline Antibiotic)", ORANGE, [
"Mechanism: Blocks AVP-cAMP signalling in collecting duct → nephrogenic DI",
"Dose: 300–600 mg twice daily",
"Onset: 3–6 days (slow — limits use in acute settings)",
"Avoid in: Liver disease (nephrotoxic in cirrhosis), renal failure",
"Use: Chronic SIAD when vaptans unavailable/unaffordable",
]),
("Urea (Oral Carbamide)", GREEN, [
"Mechanism: Osmotic agent → increases renal solute load → free water excretion",
"Dose: 15–60 g/day in 2–3 divided doses in juice/food",
"Efficacy: Comparable to fluid restriction in SIAD; additive with restriction",
"Safety: Excellent long-term profile; safe in liver disease",
"Limitation: Bitter taste → poor palatability → compliance challenge",
"Especially effective in: Cancer-related SIAD (often combined with fluid restriction)",
]),
]
y_cur = 1.62
for dname, dcol, ditems in drug_data:
add_text(slide, dname, 6.88, y_cur, 5.9, 0.3,
font_size=12, bold=True, color=dcol)
y_cur += 0.32
n = len(ditems)
add_bullets(slide, ditems, 6.88, y_cur, 5.9, n*0.3,
font_size=10.5, color=TEXT_DARK)
y_cur += n * 0.3 + 0.1
add_rect(slide, 6.88, y_cur, 5.9, 0.02,
fill_rgb=RGBColor(0xCC, 0xCC, 0xCC))
y_cur += 0.12
# ══════════════════════════════════════════════════════════════════
# SLIDE 15 — SPECIAL SITUATIONS
# ══════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
slide_header(slide, "Special Clinical Situations",
"Harrison's 22e, Ch. 56 | Davidson's 24e, Ch. 16")
special = [
("Thiazide-Induced\nHyponatremia", ORANGE, PEACH, [
"Most common drug cause of hyponatremia",
"Mechanism: Blocks DCT NCC → ↓ ECFV + ↑ AVP + ↑ thirst",
" + hypokalemia → K⁺ depletion further lowers Na⁺",
"At-risk: Elderly women, low body weight",
"Onset: Often within 1–2 weeks of starting thiazide",
"Management:",
" • STOP thiazide",
" • Aggressively replace K⁺ (K⁺ correction raises Na⁺!)",
" • IV saline if hypovolaemic",
" • Monitor strictly — overcorrection risk",
"Do NOT switch to loop diuretic if SIAD co-exists",
]),
("Exercise-Associated\nHyponatremia (EAH)", MED_BLUE, BLUEL, [
"Endurance athletes (marathon, triathlon, ultramarathon)",
"Mechanism: Excessive hypotonic fluid intake + ↑ AVP",
" (AVP elevated by nausea, pain, stress of exercise)",
"Na⁺ < 130 mEq/L: high risk of cerebral oedema",
"Prevention: Drink to thirst — NOT scheduled volumes",
"Tx mild: Oral Na⁺ supplementation + restrict water",
"Tx severe (seizures): Hypertonic saline 100 mL IV bolus",
" Correct by 1–2 mEq/L/h until symptoms resolve",
"Never give hypotonic or isotonic fluids to EAH!",
]),
("Beer Potomania &\nLow Solute Intake", GREEN, GREENL, [
"Mechanism: Extremely low daily solute excretion",
" • Beer: < 200 mOsm solute/day vs. 600–900 mOsm normal",
" • 'Tea-and-toast' diet: similar low solute problem",
"Cannot generate free water excretion without solutes",
"Responds RAPIDLY to IV saline (dangerous!)",
"High ODS risk: also malnourished, hypokalaemic, alcoholic",
"Management:",
" • IV normal saline cautiously",
" • Resume normal diet immediately",
" • Replace K⁺, thiamine, multivitamins",
" • Correct < 6–8 mEq/L per 24 h",
" • Watch for rapid overcorrection and institute DDAVP if needed",
]),
("Post-op &\nReset Osmostat", PURPLE, PURPLEL, [
"Postoperative Hyponatremia:",
" • Hypotonic IV fluids + surgical AVP surge",
" • Especially dangerous in premenopausal women",
" • Presentation: Nausea, headache → seizures in 12–24 h",
" • Prevention: Use isotonic saline for maintenance IV fluids",
"",
"Reset Osmostat (SIAD Subtype B):",
" • Osmostat 'reset' to lower set-point (~125–135 mEq/L)",
" • AVP appropriately regulated around new lower point",
" • Seen in: TB, pregnancy, malnutrition, SCI",
" • Key: Na⁺ stays stable at new lower set-point",
" • Treatment usually NOT needed — chronic stable state",
" • Fluid restriction often ineffective",
]),
]
positions = [(0.4, 1.1), (6.8, 1.1), (0.4, 4.2), (6.8, 4.2)]
for (xp, yp), (title, hcol, bg, items) in zip(positions, special):
section_box(slide, title, items, xp, yp, 6.0, 3.15, hcol, bg, font_size=11)
# ══════════════════════════════════════════════════════════════════
# SLIDE 16 — CLINICAL CASE VIGNETTE
# ══════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
slide_header(slide, "Clinical Case Vignette — Apply Your Knowledge",
"Integrative case based on Harrison's 22e principles")
# Case box
add_rect(slide, 0.4, 1.1, 12.5, 2.5, fill_rgb=BLUEL, line_rgb=MED_BLUE, line_width=2)
add_rect(slide, 0.4, 1.1, 12.5, 0.47, fill_rgb=MED_BLUE)
add_text(slide, "Case Presentation", 0.55, 1.12, 12, 0.42, font_size=14, bold=True, color=WHITE)
add_text(slide, (
"A 68-year-old woman with hypertension (on hydrochlorothiazide 25 mg/day and amlodipine) presents with 3 days of progressive confusion, "
"nausea, and unsteady gait. No focal neurological deficits. She has been eating and drinking poorly since starting a low-carbohydrate diet 2 weeks ago.\n\n"
"Vitals: BP 106/68 mmHg (sitting), HR 102/min, dry mucous membranes, reduced skin turgor, no peripheral oedema.\n\n"
"Labs: Na⁺ 119 mEq/L | K⁺ 2.8 mEq/L | Cl⁻ 80 | HCO₃ 22 | Urea 8 mg/dL | Cr 0.7 mg/dL\n"
"Glucose: 95 mg/dL | Serum Osm: 248 mOsm/kg | TSH: 2.3 mIU/L | 9AM Cortisol: 18 mcg/dL\n"
"Spot Urine Na⁺: 14 mEq/L | Urine K⁺: 38 mEq/L | Urine Osm: 520 mOsm/kg"
), 0.55, 1.63, 12.2, 1.9, font_size=11.5, color=TEXT_DARK, wrap=True)
# Analysis columns
analysis = [
("Step 1: Diagnose", MED_BLUE, BLUEL, [
"Osmolality: 248 → Hypotonic hyponatremia (REAL)",
"Glucose normal → NOT translocational",
"",
"Serum Osm = 2(119) + 95/18 + 8/2.8 = ~247 ✓",
"Matches measured Osm → no osmolal gap",
"",
"Volume status: Dehydrated clinically",
" • Dry mucosa, tachycardia, postural hypotension",
" • Urine Na⁺ = 14 → < 20 → extrarenal? BUT...",
" • Thiazide + low food intake → renal + dietary cause",
" • Hypokalemia (K⁺ 2.8) further lowers Na⁺",
"",
"DIAGNOSIS: Thiazide-induced hypovolaemic\nhyponatremia + hypokalemia + low solute intake"
]),
("Step 2: Risk Stratify", ORANGE, PEACH, [
"Severity: Na⁺ 119 mEq/L — SEVERE",
"Duration: 3 days → CHRONIC (> 48 h)",
"",
"Symptoms: Confusion + gait disturbance",
" → Neurological → warrants active treatment",
"",
"ODS Risk Factors present:",
" • Hypokalemia (K⁺ 2.8 mEq/L)",
" • Malnutrition / poor oral intake",
" • Thiazide (low solute)",
" • Starting Na⁺ = 119 (< 120 = high risk)",
"",
"Target correction rate:",
" • MAXIMUM 8 mEq/L per 24 h",
" • IDEAL: 6 mEq/L per 24 h",
" • Target Na⁺ at 24 h: 125–127 mEq/L"
]),
("Step 3: Treat", GREEN, GREENL, [
"1. STOP hydrochlorothiazide",
"",
"2. Isotonic saline 0.9% IV:",
" • Corrects ECFV deficit",
" • Suppresses AVP → water diuresis",
" • Monitor Na⁺ every 2–4 h",
"",
"3. IV Potassium chloride (KCl):",
" • Replace K⁺ to 4.0 mEq/L",
" • K⁺ correction raises Na⁺ — count it!",
"",
"4. HOLD if Na⁺ rising > 0.5 mEq/L/h",
" → Switch to D5W to slow rise",
"",
"5. Encourage diet with normal food intake",
"",
"6. If overcorrects: D5W + DDAVP 2 mcg IV",
"7. Repeat Na⁺ at 4 h, 8 h, 12 h, 24 h"
]),
]
for i, (title, hcol, bg, items) in enumerate(analysis):
xp = 0.4 + i * 4.3
section_box(slide, title, items, xp, 3.75, 4.1, 3.65, hcol, bg, font_size=10.5)
# ══════════════════════════════════════════════════════════════════
# SLIDE 17 — DAVIDSON'S PERSPECTIVE
# ══════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
slide_header(slide, "Davidson's Perspective — Key Additions",
"Davidson's Principles & Practice of Medicine, 24th Edition, Ch. 16")
add_rect(slide, 0.4, 1.1, 12.5, 5.9, fill_rgb=WHITE, line_rgb=DARK_BLUE, line_width=1)
panel_data = [
("Davidson's Classification of SIAD", MED_BLUE, BLUEL, 0.5, 1.15, 5.9, 2.5, [
"Davidson's 24e provides a practical SIAD classification by mechanism:",
"Type 1 — CNS disease: Direct hypothalamic/pituitary stimulation",
"Type 2 — Pulmonary disease: Reflex AVP release via pulmonary vagal afferents",
"Type 3 — Ectopic AVP: Tumour-derived AVP (SCLC, carcinoid) — paraneoplastic",
"Type 4 — Drug-induced: Enhanced AVP release or sensitisation of V2R",
"Type 5 — Idiopathic: All above excluded, often older patients",
"Clinical pearl (Davidson's): In elderly patients with 'unexplained' SIAD, always\n"
"screen with CT chest to exclude occult SCLC or other thoracic malignancy",
]),
("Davidson's Management Algorithm", GREEN, GREENL, 6.65, 1.15, 5.9, 2.5, [
"Davidson's 24e stepwise approach to management:",
"Step 1 — Identify & treat the underlying cause (primary priority)",
"Step 2 — Assess acuity: Acute (< 48h) vs. Chronic (> 48h)",
"Step 3 — Fluid restriction as first-line for chronic euvolemic hyponatremia",
"Step 4 — Salt tablets + furosemide as second-line for failed fluid restriction",
"Step 5 — Urea or vaptan for refractory cases or when fluid restriction is not tolerated",
"Davidson's note: In clinical practice, tolvaptan is reserved for hospital use due\n"
"to risk of rapid overcorrection outside a monitored setting",
]),
("Davidson's Emphasis: Falls & Cognition", ORANGE, PEACH, 0.5, 3.75, 5.9, 2.5, [
"Often overlooked aspects highlighted by Davidson's 24e:",
"• Even mild hyponatremia (Na⁺ 130–134 mEq/L) impairs attention and reaction time",
"• 3-fold increased risk of falls in ambulatory hyponatremic patients",
"• 2-fold increased risk of osteoporotic fractures",
"• Gait unsteadiness mimics Parkinson's or cerebellar disease in the elderly",
"• Cognitive impairment mistaken for dementia",
"Davidson's recommendation: Treat even mild chronic hyponatremia in\n"
"elderly patients if associated with falls or cognitive symptoms",
]),
("Davidson's: SIAD in Cancer", RED, PEACH, 6.65, 3.75, 5.9, 2.5, [
"Cancer-associated SIAD (Davidson's 24e, Ch. 16 & oncology section):",
"• SCLC: 10–15% of patients develop SIAD; associated with worse prognosis",
"• Initial treatment of SCLC often corrects SIAD within weeks",
"• For refractory cancer SIAD: Oral urea is first-line (cheap, effective, safe)",
"• Tolvaptan in cancer SIAD: Effective but expensive; use with caution if hepatic mets",
"• Fluid restriction often poorly tolerated in cancer patients (fatigue, anorexia)",
"Davidson's alert: Hyponatraemia in a new cancer diagnosis is a poor prognostic\n"
"marker and should be actively managed, not passively observed",
]),
]
for title, hcol, bg, x, y, w, h, items in panel_data:
add_rect(slide, x, y, w, h, fill_rgb=bg, line_rgb=hcol, line_width=1.5)
add_rect(slide, x, y, w, 0.38, fill_rgb=hcol)
add_text(slide, title, x+0.08, y+0.02, w-0.12, 0.35,
font_size=12, bold=True, color=WHITE)
add_bullets(slide, items, x+0.1, y+0.41, w-0.15, h-0.47,
font_size=10.5, color=TEXT_DARK, bold_idx=[0])
# ══════════════════════════════════════════════════════════════════
# SLIDE 18 — KEY PEARLS & SUMMARY
# ══════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, 13.333, 7.5, fill_rgb=DARK_BLUE)
add_rect(slide, 0, 1.0, 0.07, 6.2, fill_rgb=ACCENT)
add_text(slide, "15 Key Clinical Pearls — Hyponatremia", 0.3, 0.1, 12.7, 0.8,
font_size=28, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
left_pearls = [
"1. Na⁺ < 135 = hyponatremia; < 125 = severe; < 115 = critical",
"2. Always measure serum osmolality first to rule out pseudo/translocational",
"3. Classify by volume status — this drives the entire management",
"4. SIAD is a diagnosis of exclusion: rule out hypothyroidism & adrenal insufficiency",
"5. Urine Na⁺ < 20: hypovolemic or hypervolemic; > 40: SIAD or renal cause",
"6. Rate of fall matters more than absolute level for symptoms in chronic cases",
"7. Thiazides: most common drug cause — stop immediately and replace K⁺",
"8. K⁺ replacement raises Na⁺ — always factor this into correction calculations",
]
right_pearls = [
"9. Acute symptomatic: 100–150 mL 3% NaCl bolus IV stat; repeat up to 3×",
"10. Chronic: correct ≤ 8–10 mEq/L per 24 h to prevent ODS",
"11. ODS risk highest: alcoholism, malnutrition, hypokaemia, liver disease",
"12. Overcorrection: D5W + DDAVP 2 mcg IV to bring Na⁺ back down",
"13. Tolvaptan effective in SIAD/CHF — avoid > 30 days in cirrhosis",
"14. Even mild hyponatremia (Na⁺ 130–134) increases falls/fracture risk (Davidson's)",
"15. New SIAD in smoker → urgent CT thorax to exclude SCLC",
" Treat the cause — Na⁺ often corrects spontaneously",
]
add_rect(slide, 0.4, 1.0, 6.1, 6.15, fill_rgb=MED_BLUE)
add_bullets(slide, left_pearls, 0.55, 1.1, 5.8, 5.9, font_size=12.5, color=WHITE)
add_rect(slide, 6.85, 1.0, 6.1, 6.15, fill_rgb=RGBColor(0x12, 0x3A, 0x70))
add_bullets(slide, right_pearls, 7.0, 1.1, 5.8, 5.9, font_size=12.5, color=WHITE)
add_text(slide,
"Reference: Harrison's Principles of Internal Medicine, 22nd Edition (2025, McGraw-Hill) | Davidson's Principles & Practice of Medicine, 24th Edition",
0.3, 7.2, 12.7, 0.28, font_size=9, color=RGBColor(0xAA, 0xCC, 0xFF), italic=True, align=PP_ALIGN.CENTER)
# ══════════════════════════════════════════════════════════════════
# SAVE
# ══════════════════════════════════════════════════════════════════
output_path = "/tmp/workspace/hyponatremia-ppt/Hyponatremia_Extended_Harrison_Davidson.pptx"
buf = BytesIO()
prs.save(buf)
with open(output_path, "wb") as f:
f.write(buf.getvalue())
print(f"Saved: {output_path}")
print(f"Total slides: {len(prs.slides)}")
cd /tmp/workspace/hyponatremia-ppt && python create_ppt_v2.py 2>&1
ls -lh /tmp/workspace/hyponatremia-ppt/
Hyponatremia Extended Harrison Davidson
Presentation · PPTX
| Slide | New / Expanded Content |
|---|---|
| 1 | Title |
| 2 | NEW - Presentation Agenda/Outline (14 topics colour-coded) |
| 3 | Definition + Epidemiology (stats boxes: 22% hospitalised, 2-3× mortality) |
| 4 | NEW - Normal Na⁺/Water Physiology: AVP synthesis, V2R-AQP2 mechanism, tubular handling |
| 5 | Classification & Pathophysiology (3 pathways in detail) |
| 6 | Etiology: Hypovolemic & Euvolemic (expanded drug list, CSW distinction) |
| 7 | NEW - Etiology: Hypervolemic + full comparison table (8 parameters) |
| 8 | NEW - SIAD in depth: Bartter-Schwartz criteria, 4 subtypes, ectopic AVP in cancer |
| 9 | Clinical Features: Acute vs Chronic, symptom spectrum |
| 10 | NEW - Investigations: 3-step workup (bloods, urine studies, specific tests) |
| 11 | NEW - Diagnostic Algorithm flowchart (visual step-by-step) |
| 12 | Treatment Principles + ODS (expanded, with overcorrection rescue protocol) |
| 13 | Treatment by Volume Status |
| 14 | Hypertonic Saline + worked Adrogue-Madias example + pharmacotherapy |
| 15 | Special Situations (4 scenarios including Reset Osmostat) |
| 16 | NEW - Clinical Case Vignette (68F thiazide + hypokaemia + confusion, full worked analysis) |
| 17 | NEW - Davidson's perspective: SIAD classification, falls/cognition data, cancer SIAD |
| 18 | 15 Key Clinical Pearls summary |