mkdir -p /home/daytona/workspace/pharm-study-guide && cat > /home/daytona/workspace/pharm-study-guide/make_pdf.py << 'PYEOF'
from reportlab.lib.pagesizes import A4, letter
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import inch, cm
from reportlab.platypus import (SimpleDocTemplate, Paragraph, Spacer, Table,
TableStyle, HRFlowable, PageBreak, KeepTogether)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import BaseDocTemplate, Frame, PageTemplate
import reportlab.lib.colors as colors
# Color palette
NAVY = colors.HexColor('#1a2a4a')
DARK_BLUE = colors.HexColor('#0d1b35')
TEAL = colors.HexColor('#00bcd4')
GREEN = colors.HexColor('#4caf50')
RED = colors.HexColor('#ef5350')
ORANGE = colors.HexColor('#ff9800')
YELLOW = colors.HexColor('#ffd600')
LIGHT_BLUE = colors.HexColor('#e3f2fd')
LIGHT_GREEN = colors.HexColor('#e8f5e9')
LIGHT_RED = colors.HexColor('#ffebee')
LIGHT_ORANGE = colors.HexColor('#fff3e0')
LIGHT_YELLOW = colors.HexColor('#fffde7')
PURPLE = colors.HexColor('#7c4dff')
LIGHT_PURPLE = colors.HexColor('#ede7f6')
WHITE = colors.white
DARK_TEXT = colors.HexColor('#1a1a2e')
MED_GRAY = colors.HexColor('#546e7a')
doc = SimpleDocTemplate(
'/home/daytona/workspace/pharm-study-guide/Pharmacology_Study_Guide.pdf',
pagesize=A4,
rightMargin=1.8*cm, leftMargin=1.8*cm,
topMargin=1.5*cm, bottomMargin=1.5*cm
)
styles = getSampleStyleSheet()
# Custom styles
def s(name, **kw):
return ParagraphStyle(name, **kw)
title_style = s('Title', fontSize=22, textColor=WHITE, alignment=TA_CENTER,
fontName='Helvetica-Bold', spaceAfter=4, spaceBefore=4,
backColor=NAVY, borderPad=10, leading=28)
subtitle_style = s('Subtitle', fontSize=11, textColor=TEAL, alignment=TA_CENTER,
fontName='Helvetica', spaceAfter=10)
section_title = s('SectionTitle', fontSize=14, textColor=WHITE, alignment=TA_CENTER,
fontName='Helvetica-Bold', spaceAfter=6, spaceBefore=10,
backColor=NAVY, borderPad=8, leading=20)
card_title = s('CardTitle', fontSize=12, textColor=WHITE, alignment=TA_LEFT,
fontName='Helvetica-Bold', spaceAfter=2, spaceBefore=2, leading=16)
card_body = s('CardBody', fontSize=9.5, textColor=DARK_TEXT, alignment=TA_LEFT,
fontName='Helvetica', spaceAfter=2, spaceBefore=1, leading=14)
mnemonic_style = s('Mnemonic', fontSize=11, textColor=colors.HexColor('#880000'),
alignment=TA_LEFT, fontName='Helvetica-Bold',
spaceAfter=3, spaceBefore=3, leading=16)
bullet_style = s('Bullet', fontSize=9.5, textColor=DARK_TEXT, alignment=TA_LEFT,
fontName='Helvetica', spaceAfter=1, spaceBefore=1, leading=13,
leftIndent=12)
warning_style = s('Warning', fontSize=9, textColor=colors.HexColor('#b71c1c'),
fontName='Helvetica-Bold', alignment=TA_LEFT, leading=13)
tip_style = s('Tip', fontSize=9, textColor=colors.HexColor('#1b5e20'),
fontName='Helvetica-Bold', alignment=TA_LEFT, leading=13)
normal_center = s('NormalCenter', fontSize=9.5, textColor=DARK_TEXT, alignment=TA_CENTER,
fontName='Helvetica', leading=13)
story = []
# ─── COVER ──────────────────────────────────────────────────────────────────
story.append(Spacer(1, 0.5*cm))
# Big title banner
cover_data = [
[Paragraph('<font size=24><b>PHARMACOLOGY EXAM NOTES</b></font>',
s('ct', fontSize=24, textColor=WHITE, fontName='Helvetica-Bold',
alignment=TA_CENTER, leading=30)), ],
[Paragraph('<font size=12>Mnemonics · Flashcards · Quick Reference · Antidotes</font>',
s('cs', fontSize=12, textColor=TEAL, fontName='Helvetica',
alignment=TA_CENTER, leading=18))],
[Paragraph('Quick Review Study Guide',
s('cr', fontSize=10, textColor=colors.HexColor('#90caf9'), fontName='Helvetica',
alignment=TA_CENTER, leading=16))],
]
cover_table = Table(cover_data, colWidths=[17*cm])
cover_table.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), NAVY),
('TOPPADDING', (0,0), (0,0), 18),
('BOTTOMPADDING', (0,2), (0,2), 18),
('LEFTPADDING', (0,0), (-1,-1), 15),
('RIGHTPADDING', (0,0), (-1,-1), 15),
('ROUNDEDCORNERS', [8]),
]))
story.append(cover_table)
story.append(Spacer(1, 0.4*cm))
# TOC badge row
def badge(text, bg):
d = [[Paragraph(f'<b>{text}</b>', s('b', fontSize=8.5, textColor=WHITE, fontName='Helvetica-Bold', alignment=TA_CENTER, leading=12))]]
t = Table(d, colWidths=[3.8*cm])
t.setStyle(TableStyle([('BACKGROUND',(0,0),(-1,-1),bg),('TOPPADDING',(0,0),(-1,-1),5),('BOTTOMPADDING',(0,0),(-1,-1),5),('ROUNDEDCORNERS',[5])]))
return t
badges = [[badge('1. Autonomic Drugs', TEAL), badge('2. Antipsychotics', PURPLE),
badge('3. Antidepressants', GREEN), badge('4. Serotonin/NMS', RED)]]
bt = Table(badges, colWidths=[4.25*cm]*4)
bt.setStyle(TableStyle([('ALIGN',(0,0),(-1,-1),'CENTER'),('LEFTPADDING',(0,0),(-1,-1),2),('RIGHTPADDING',(0,0),(-1,-1),2)]))
story.append(bt)
story.append(Spacer(1, 0.2*cm))
badges2 = [[badge('5. Lithium', ORANGE), badge('6. ACEi/ARBs', colors.HexColor('#00838f')),
badge('7. Diuretics', colors.HexColor('#558b2f')), badge('8-13. Cardio Drugs', colors.HexColor('#6a1b9a'))]]
bt2 = Table(badges2, colWidths=[4.25*cm]*4)
bt2.setStyle(TableStyle([('ALIGN',(0,0),(-1,-1),'CENTER'),('LEFTPADDING',(0,0),(-1,-1),2),('RIGHTPADDING',(0,0),(-1,-1),2)]))
story.append(bt2)
story.append(Spacer(1, 0.5*cm))
# ─── HELPER FUNCTIONS ────────────────────────────────────────────────────────
def section_header(text, color=NAVY):
data = [[Paragraph(f'<b>{text}</b>', s('sh', fontSize=13, textColor=WHITE, fontName='Helvetica-Bold', alignment=TA_CENTER, leading=18))]]
t = Table(data, colWidths=[17*cm])
t.setStyle(TableStyle([('BACKGROUND',(0,0),(-1,-1),color),('TOPPADDING',(0,0),(-1,-1),8),('BOTTOMPADDING',(0,0),(-1,-1),8),('ROUNDEDCORNERS',[6])]))
return t
def flashcard(title, title_bg, body_rows, body_bg=colors.HexColor('#f8f9fa')):
"""body_rows = list of (label, content, label_color)"""
rows = [[Paragraph(f'<b>{title}</b>', s('ft', fontSize=11, textColor=WHITE, fontName='Helvetica-Bold', alignment=TA_LEFT, leading=15))]]
card_data = [rows[0]]
for label, content, lc in body_rows:
card_data.append([
Paragraph(f'<font color="{lc}"><b>{label}</b></font> {content}',
s('fb', fontSize=9, textColor=DARK_TEXT, fontName='Helvetica', leading=13))
])
t = Table(card_data, colWidths=[17*cm])
style_cmds = [
('BACKGROUND',(0,0),(0,0), title_bg),
('BACKGROUND',(0,1),(-1,-1), body_bg),
('TOPPADDING',(0,0),(0,0),8), ('BOTTOMPADDING',(0,0),(0,0),8),
('TOPPADDING',(0,1),(-1,-1),5), ('BOTTOMPADDING',(0,1),(-1,-1),5),
('LEFTPADDING',(0,0),(-1,-1),10), ('RIGHTPADDING',(0,0),(-1,-1),10),
('ROUNDEDCORNERS',[6]),
('BOX',(0,0),(-1,-1),0.8, colors.HexColor('#dee2e6')),
]
t.setStyle(TableStyle(style_cmds))
return t
def mnemonic_box(title, items, bg=colors.HexColor('#fff9c4'), border=YELLOW):
"""items = list of (letter_part, explanation)"""
content = f'<b>🧠 {title}</b><br/>'
for lp, exp in items:
content += f' <b>{lp}</b> = {exp}<br/>'
data = [[Paragraph(content, s('mb', fontSize=9.5, textColor=DARK_TEXT, fontName='Helvetica', leading=14))]]
t = Table(data, colWidths=[17*cm])
t.setStyle(TableStyle([
('BACKGROUND',(0,0),(-1,-1),bg),
('BOX',(0,0),(-1,-1),2,border),
('TOPPADDING',(0,0),(-1,-1),8),('BOTTOMPADDING',(0,0),(-1,-1),8),
('LEFTPADDING',(0,0),(-1,-1),12),('ROUNDEDCORNERS',[4]),
]))
return t
def two_col_table(left_content, right_content, left_bg=LIGHT_BLUE, right_bg=LIGHT_GREEN):
t = Table([[left_content, right_content]], colWidths=[8.3*cm, 8.3*cm], hAlign='LEFT')
t.setStyle(TableStyle([
('VALIGN',(0,0),(-1,-1),'TOP'),
('LEFTPADDING',(0,0),(-1,-1),0),('RIGHTPADDING',(0,0),(-1,-1),0),
('TOPPADDING',(0,0),(-1,-1),0),('BOTTOMPADDING',(0,0),(-1,-1),0),
('INNERGRID',(0,0),(-1,-1),0,WHITE),
]))
return t
def warning_box(text, bg=colors.HexColor('#ffebee'), border=RED):
data = [[Paragraph(f'⚠️ <b>{text}</b>', s('wb', fontSize=9, textColor=colors.HexColor('#c62828'), fontName='Helvetica-Bold', leading=13))]]
t = Table(data, colWidths=[17*cm])
t.setStyle(TableStyle([('BACKGROUND',(0,0),(-1,-1),bg),('BOX',(0,0),(-1,-1),2,border),('TOPPADDING',(0,0),(-1,-1),6),('BOTTOMPADDING',(0,0),(-1,-1),6),('LEFTPADDING',(0,0),(-1,-1),10),('ROUNDEDCORNERS',[4])]))
return t
def tip_box(text, bg=colors.HexColor('#e8f5e9'), border=GREEN):
data = [[Paragraph(f'💡 <b>{text}</b>', s('tb', fontSize=9, textColor=colors.HexColor('#1b5e20'), fontName='Helvetica-Bold', leading=13))]]
t = Table(data, colWidths=[17*cm])
t.setStyle(TableStyle([('BACKGROUND',(0,0),(-1,-1),bg),('BOX',(0,0),(-1,-1),2,border),('TOPPADDING',(0,0),(-1,-1),6),('BOTTOMPADDING',(0,0),(-1,-1),6),('LEFTPADDING',(0,0),(-1,-1),10),('ROUNDEDCORNERS',[4])]))
return t
def small(text, style_base=None):
return Paragraph(text, s('sm', fontSize=9, textColor=DARK_TEXT, fontName='Helvetica', leading=13))
def sp(h=0.25): return Spacer(1, h*cm)
# ════════════════════════════════════════════════════════════════
# SECTION 1: AUTONOMIC DRUGS
# ════════════════════════════════════════════════════════════════
story.append(section_header('SECTION 1: AUTONOMIC NERVOUS SYSTEM DRUGS', TEAL))
story.append(sp(0.3))
# --- 1A Adrenergic Agonists flashcard
story.append(flashcard(
'1A. Adrenergic Agonists (Sympathomimetics)',
TEAL,
[
('#1 Key Drugs', 'Epi (α1,α2,β1,β2) | NE (α1,α2,β1) | Dopamine | Dobutamine (β1) | Phenylephrine (α1) | Clonidine (α2) | Albuterol (β2)', '#006064'),
('✅ USE', 'Anaphylaxis (Epi) · Cardiac arrest (Epi) · Septic shock (NE/Dopa) · Asthma (Albuterol) · HTN (Clonidine) · Nasal congestion (Phenylephrine)', '#1b5e20'),
('🚫 AVOID', 'Severe HTN · Tachyarrhythmias · Closed-angle glaucoma · MAOI use · Cocaine use', '#b71c1c'),
('⚠️ SE', '↑HR & BP · Tremor · Headache · Urinary retention (α1) · Hyperglycemia · Rebound HTN (Clonidine withdrawal)', '#e65100'),
('☠ TOXICITY Rx', 'HTN crisis → Phentolamine | Tachycardia → β-blocker | NEVER β-blocker alone in cocaine (unopposed α!) | Clonidine OD → Atropine + Naloxone', '#b71c1c'),
]
))
story.append(sp(0.2))
story.append(warning_box('COCAINE TOXICITY: NEVER give β-blocker alone → unopposed α-stimulation → worse HTN & vasospasm!'))
story.append(sp(0.2))
# --- 1B Adrenergic Antagonists
story.append(flashcard(
'1B. Adrenergic Antagonists (Sympatholytics)',
colors.HexColor('#00695c'),
[
('Key Drugs', 'Prazosin (α1) | Phentolamine (non-sel α) | Metoprolol/Atenolol (β1) | Propranolol (non-sel β) | Carvedilol/Labetalol (α+β)', '#004d40'),
('✅ USE', 'HTN · BPH (α1-blockers) · Pheochromocytoma (Phentolamine) · HF (Carvedilol) · Angina/post-MI (β-blockers) · Migraine prophylaxis (Propranolol)', '#1b5e20'),
('🚫 AVOID', 'β-blockers: Asthma/COPD · 2nd/3rd degree AV block · Acute decompensated HF · Cocaine use · Never stop abruptly!', '#b71c1c'),
('⚠️ SE', 'Bradycardia · Fatigue · Cold extremities · Bronchospasm (non-selective) · Sexual dysfunction · Masks hypoglycemia symptoms', '#e65100'),
('☠ OD Rx', 'Atropine (bradycardia) → IV GLUCAGON (drug of choice - bypasses β-receptor!) → Calcium IV → High-dose Insulin → Vasopressors', '#b71c1c'),
]
))
story.append(sp(0.2))
# --- 1C Cholinergic Agonists
story.append(flashcard(
'1C. Cholinergic Agonists (Parasympathomimetics)',
colors.HexColor('#1565c0'),
[
('Key Drugs', 'Bethanechol (urinary retention) | Pilocarpine (glaucoma) | Neostigmine/Pyridostigmine (MG, NMB reversal) | Organophosphates (irreversible AChE inhibitor)', '#0d47a1'),
('✅ USE', 'Urinary retention (Bethanechol) · Glaucoma (Pilocarpine) · Myasthenia gravis (Neostigmine) · Reversal of NMB · Alzheimer\'s (Donepezil) · Dry mouth/Sjögren\'s (Pilocarpine)', '#1b5e20'),
('🚫 AVOID', 'Asthma/COPD · GI/bladder obstruction · Bradycardia · Parkinson\'s · Peptic ulcer', '#b71c1c'),
('☠ CHOLINERGIC CRISIS Rx', 'ATROPINE high-dose (blocks muscarinic) + PRALIDOXIME 2-PAM (regenerates AChE - give EARLY before aging!) + BZDs for seizures', '#b71c1c'),
]
))
story.append(sp(0.2))
story.append(mnemonic_box('SLUDGE / DUMBELS — Cholinergic Toxicity Signs', [
('S', 'Salivation | D = Diarrhea'),
('L', 'Lacrimation | U = Urination'),
('U', 'Urination | M = Miosis'),
('D', 'Defecation | B = Bradycardia'),
('G', 'GI distress | E = Emesis'),
('E', 'Emesis | L = Lacrimation'),
('', '| S = Salivation (+ bronchospasm, diaphoresis, seizures)'),
]))
story.append(sp(0.2))
# --- 1D Anticholinergics
story.append(flashcard(
'1D. Anticholinergics / Antimuscarinics',
colors.HexColor('#6a1b9a'),
[
('Key Drugs', 'Atropine | Scopolamine (motion sickness) | Ipratropium/Tiotropium (COPD) | Oxybutynin (OAB) | Benztropine (Parkinson tremor)', '#4a148c'),
('✅ USE', 'Bradycardia (Atropine) · Organophosphate OD (Atropine) · COPD (Ipratropium) · Overactive bladder (Oxybutynin) · Parkinson tremor (Benztropine) · Motion sickness (Scopolamine)', '#1b5e20'),
('🚫 AVOID', 'Closed-angle glaucoma (↑IOP) · BPH/urinary retention · Myasthenia gravis · Tachyarrhythmias · Elderly (delirium risk)', '#b71c1c'),
('☠ ANTIDOTE', 'PHYSOSTIGMINE (crosses BBB → treats CNS delirium) | Neostigmine (peripheral only) | Cooling for hyperthermia | BZDs for agitation', '#b71c1c'),
]
))
story.append(sp(0.2))
story.append(mnemonic_box('Anticholinergic Toxidrome — "Mad as a Hatter" Rule of 7', [
('HOT as a hare', '→ Hyperthermia'),
('DRY as a bone', '→ Anhidrosis, dry mouth, constipation'),
('RED as a beet', '→ Flushing (vasodilation)'),
('BLIND as a bat', '→ Mydriasis, blurred vision'),
('MAD as a hatter', '→ Confusion, delirium, hallucinations'),
('FULL as a flask', '→ Urinary retention'),
('FAST as a fiddle', '→ Tachycardia'),
], bg=colors.HexColor('#f3e5f5'), border=colors.HexColor('#7b1fa2')))
story.append(sp(0.3))
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════
# SECTION 2: ANTIPSYCHOTICS
# ════════════════════════════════════════════════════════════════
story.append(section_header('SECTION 2: ANTIPSYCHOTICS', PURPLE))
story.append(sp(0.3))
story.append(flashcard(
'2. Antipsychotics — Typical (1st Gen) vs Atypical (2nd Gen)',
PURPLE,
[
('Typical (1st Gen)', 'Haloperidol, Chlorpromazine, Fluphenazine, Thioridazine | Mechanism: D2 blockade', '#4a148c'),
('Atypical (2nd Gen)', 'Clozapine, Olanzapine, Quetiapine, Risperidone, Aripiprazole | Mechanism: D2 + 5-HT2A blockade (fewer EPS)', '#4a148c'),
('✅ USE', 'Schizophrenia · Bipolar mania · Delirium (Haloperidol) · Tourette\'s (Haloperidol) · Treatment-resistant (Clozapine ONLY) · Antiemetic (Prochlorperazine)', '#1b5e20'),
('🚫 AVOID', 'Parkinson\'s (worsen) · Prolactinoma · QT prolongation (Ziprasidone, Thioridazine) · Clozapine: bone marrow suppression → WEEKLY WBC monitoring!', '#b71c1c'),
('⚠️ Metabolic SE', 'Weight gain + DM + Dyslipidemia: WORST with Clozapine & Olanzapine ("CO" = Clozapine & Olanzapine = most metabolic)', '#e65100'),
]
))
story.append(sp(0.2))
story.append(mnemonic_box('EPS Timeline Mnemonic — "4 A\'s in Order"', [
('Hours-Days', '→ Acute Dystonia (muscle spasm) → Rx: Benztropine or Diphenhydramine IM'),
('Days', '→ Akathisia (restlessness, can\'t sit still) → Rx: Propranolol or BZD'),
('Days-Weeks', '→ Akinesia/Parkinsonism (bradykinesia, rigidity) → Rx: Benztropine'),
('Months-Years', '→ Tardive Dyskinesia (irreversible lip-smacking) → Rx: Valbenazine/Deutetrabenazine'),
], bg=colors.HexColor('#ede7f6'), border=PURPLE))
story.append(sp(0.2))
story.append(flashcard(
'NMS — Neuroleptic Malignant Syndrome (EMERGENCY!)',
RED,
[
('Cause', 'Antipsychotics / Dopamine antagonists (can also occur when stopping dopaminergic drugs)', '#b71c1c'),
('Classic Signs', 'FEVER (high) + Lead-pipe RIGIDITY + Autonomic instability + ↑CK (very high) + Altered consciousness', '#b71c1c'),
('Rx STEP 1', 'STOP antipsychotic IMMEDIATELY', '#1b5e20'),
('Rx STEP 2', 'DANTROLENE (muscle relaxant — reduces rigidity) + BROMOCRIPTINE (dopamine agonist)', '#1b5e20'),
('Rx STEP 3', 'Supportive: Active cooling + Hydration + ICU admission', '#1b5e20'),
]
))
story.append(sp(0.3))
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════
# SECTION 3: ANTIDEPRESSANTS
# ════════════════════════════════════════════════════════════════
story.append(section_header('SECTION 3: ANTIDEPRESSANTS', GREEN))
story.append(sp(0.3))
story.append(flashcard(
'3A. SSRIs — 1st Line for Depression',
GREEN,
[
('Drugs', 'Fluoxetine · Sertraline · Escitalopram · Citalopram · Paroxetine · Fluvoxamine', '#1b5e20'),
('✅ USE', 'MDD (1st line) · Anxiety · OCD · PTSD · Bulimia (Fluoxetine) · PMDD', '#1b5e20'),
('🚫 AVOID', 'MAOIs (washout: 2 wks; Fluoxetine → 5 wks!) · Bipolar without mood stabilizer (may trigger mania)', '#b71c1c'),
('⚠️ SE', 'GI upset (early) · Sexual dysfunction (most common long-term stop reason) · Insomnia · Hyponatremia/SIADH (elderly) · Bleeding risk (↓platelet serotonin)', '#e65100'),
('💡 Key Facts', 'Fluoxetine = longest half-life → LEAST discontinuation syndrome | Paroxetine = most weight gain | Citalopram at high doses → QT prolongation', '#1565c0'),
]
))
story.append(sp(0.2))
story.append(flashcard(
'3C. TCAs — Tricyclic Antidepressants (Dangerous in OD!)',
colors.HexColor('#bf360c'),
[
('Drugs', 'Amitriptyline · Nortriptyline · Imipramine · Clomipramine (OCD) · Desipramine', '#bf360c'),
('✅ USE', 'Depression (2nd/3rd line) · Neuropathic pain (Amitriptyline) · Migraine prophylaxis · Panic disorder · Enuresis (Imipramine)', '#1b5e20'),
('🚫 AVOID', 'Recent MI/arrhythmias · QT prolongation · Seizure disorder · Glaucoma · BPH · MAOIs · Elderly (high anticholinergic burden)', '#b71c1c'),
('⚠️ SE', 'Anticholinergic (dry mouth, constipation, urinary retention) · Antihistamine (sedation, weight gain) · α1-blockade (orthostatic hypotension) · QRS widening', '#e65100'),
('☠ TCA OD — 3 C\'s', 'COMA + CONVULSIONS + CARDIOTOXICITY (wide QRS → arrhythmias) | Rx: SODIUM BICARBONATE IV | AVOID: Flumazenil (↑seizures!), Physostigmine', '#b71c1c'),
]
))
story.append(sp(0.2))
story.append(flashcard(
'3D. MAOIs — Best for Atypical Depression',
colors.HexColor('#4e342e'),
[
('Drugs', 'Phenelzine · Tranylcypromine · Isocarboxazid · Selegiline (MAO-B patch — Parkinson\'s)', '#3e2723'),
('✅ USE', 'Atypical depression (best efficacy) · Treatment-resistant depression · Panic · Social anxiety · Parkinson\'s (Selegiline)', '#1b5e20'),
('🚫 AVOID WITH', 'ALL serotonergic drugs · Sympathomimetics · Tyramine-rich foods (cheese, wine, aged meats!) · Meperidine/Tramadol · Carbamazepine', '#b71c1c'),
('☠ HYPERTENSIVE CRISIS (Cheese Reaction)', 'Severe HA + HTN + palpitations after tyramine | Rx: Phentolamine or Nitroprusside IV | AVOID β-blockers (unopposed α!)', '#b71c1c'),
('⚡ WASHOUT', 'Wait 14 DAYS before/after switching MAOIs ↔ SSRIs | Fluoxetine needs 5 WEEKS washout (long half-life!)', '#e65100'),
]
))
story.append(sp(0.2))
# Other antidepressants table
other_ad_data = [
[Paragraph('<b>Drug</b>', s('h', fontSize=9, textColor=WHITE, fontName='Helvetica-Bold', alignment=TA_CENTER, leading=12)),
Paragraph('<b>Best For</b>', s('h', fontSize=9, textColor=WHITE, fontName='Helvetica-Bold', alignment=TA_CENTER, leading=12)),
Paragraph('<b>Unique SE / Warning</b>', s('h', fontSize=9, textColor=WHITE, fontName='Helvetica-Bold', alignment=TA_CENTER, leading=12))],
[small('Bupropion (NDRI)'), small('Depression + Smoking cessation + ADHD\nNO sexual SE, NO weight gain'), small('⚠️ SEIZURES (dose-dependent)\n🚫 CI: Bulimia, anorexia, seizure d/o')],
[small('Mirtazapine (NaSSA)'), small('Depression + Anxiety + Insomnia\nGood for elderly/underweight'), small('Sedation, weight gain, ↑appetite\nRare: agranulocytosis')],
[small('Trazodone'), small('Insomnia (low dose)\nDepression'), small('⚠️ PRIAPISM (urologic emergency!)\nSedation, orthostatic hypotension')],
[small('Vortioxetine'), small('Depression with\ncognitive symptoms'), small('Serotonin syndrome risk\nwith combinations')],
]
other_t = Table(other_ad_data, colWidths=[3.5*cm, 7*cm, 6.5*cm])
other_t.setStyle(TableStyle([
('BACKGROUND',(0,0),(-1,0),colors.HexColor('#2e7d32')),
('BACKGROUND',(0,1),(-1,1),LIGHT_GREEN), ('BACKGROUND',(0,2),(-1,2),WHITE),
('BACKGROUND',(0,3),(-1,3),LIGHT_GREEN), ('BACKGROUND',(0,4),(-1,4),WHITE),
('GRID',(0,0),(-1,-1),0.5,colors.HexColor('#c8e6c9')),
('VALIGN',(0,0),(-1,-1),'MIDDLE'), ('ROWBACKGROUNDS',(0,1),(-1,-1),[LIGHT_GREEN, WHITE]),
('TOPPADDING',(0,0),(-1,-1),5), ('BOTTOMPADDING',(0,0),(-1,-1),5),
('LEFTPADDING',(0,0),(-1,-1),7), ('ROUNDEDCORNERS',[5]),
]))
story.append(Paragraph('<b>3E. Other Antidepressants</b>', s('t3e', fontSize=10, textColor=colors.HexColor('#2e7d32'), fontName='Helvetica-Bold', leading=14)))
story.append(sp(0.1))
story.append(other_t)
story.append(sp(0.3))
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════
# SECTION 4: SEROTONIN SYNDROME + LITHIUM
# ════════════════════════════════════════════════════════════════
story.append(section_header('SECTION 4: SEROTONIN SYNDROME vs NMS', RED))
story.append(sp(0.3))
# SS vs NMS table
ss_nms_data = [
[Paragraph('<b>Feature</b>', s('h', fontSize=9.5, textColor=WHITE, fontName='Helvetica-Bold', alignment=TA_CENTER, leading=13)),
Paragraph('<b>🔴 Serotonin Syndrome</b>', s('h', fontSize=9.5, textColor=WHITE, fontName='Helvetica-Bold', alignment=TA_CENTER, leading=13)),
Paragraph('<b>🟣 NMS</b>', s('h', fontSize=9.5, textColor=WHITE, fontName='Helvetica-Bold', alignment=TA_CENTER, leading=13))],
[small('Onset'), small('HOURS (rapid)'), small('DAYS (slow)')],
[small('Cause'), small('Serotonergic drugs\n(SSRIs + MAOIs, Tramadol, etc.)'), small('Antipsychotics /\nDopamine antagonists')],
[small('Muscle Tone'), small('CLONUS + Hyperreflexia\n(most specific: CLONUS)'), small('Lead-pipe RIGIDITY\nBradykinesia')],
[small('Pupils'), small('Mydriasis'), small('Variable')],
[small('CK Level'), small('Mildly elevated'), small('VERY elevated')],
[small('Treatment'), small('Cyproheptadine\n(5-HT antagonist)'), small('Dantrolene +\nBromocriptine')],
]
ss_t = Table(ss_nms_data, colWidths=[4*cm, 6.5*cm, 6.5*cm])
ss_t.setStyle(TableStyle([
('BACKGROUND',(0,0),(-1,0), colors.HexColor('#c62828')),
('ROWBACKGROUNDS',(0,1),(-1,-1),[LIGHT_RED, WHITE]),
('GRID',(0,0),(-1,-1),0.5,colors.HexColor('#ffcdd2')),
('VALIGN',(0,0),(-1,-1),'MIDDLE'),
('TOPPADDING',(0,0),(-1,-1),5), ('BOTTOMPADDING',(0,0),(-1,-1),5),
('LEFTPADDING',(0,0),(-1,-1),7), ('ROUNDEDCORNERS',[5]),
]))
story.append(ss_t)
story.append(sp(0.2))
story.append(mnemonic_box('Serotonin Syndrome Treatment — "Stop CBA"', [
('S', 'Stop all serotonergic agents immediately'),
('C', 'Cyproheptadine (5-HT1A/2A antagonist) — the antidote'),
('B', 'Benzodiazepines (agitation, muscle rigidity, seizures)'),
('A', 'Active cooling for hyperthermia (>41°C → ice packs)'),
('+', 'ICU monitoring · Avoid physical restraints (→ rhabdomyolysis) · Intubation if severe'),
], bg=LIGHT_RED, border=RED))
story.append(sp(0.3))
story.append(section_header('SECTION 5: LITHIUM', ORANGE))
story.append(sp(0.3))
story.append(flashcard(
'5. Lithium — Narrow Therapeutic Index!',
ORANGE,
[
('Therapeutic Range', '0.6–1.2 mEq/L | Toxic: >1.5 | Moderately toxic: >2.0 | Severely toxic: >2.5', '#e65100'),
('✅ USE', 'Bipolar disorder (1st line — maintenance + acute mania) · Bipolar depression · Augmentation in refractory MDD · ↓Suicide risk', '#1b5e20'),
('🚫 AVOID', 'Pregnancy (Ebstein anomaly — tricuspid valve defect!) · Renal failure · Dehydration · Diuretics (thiazides ↑Li levels!) · NSAIDs · ACEi', '#b71c1c'),
('⚠️ SE', 'Fine tremor (most common) · Polyuria/polydipsia (nephrogenic DI) · Hypothyroidism (20-40%) · Weight gain · Acne · Leukocytosis (benign)', '#e65100'),
('Things that ↑Li LEVELS', 'NSAIDs · Thiazide diuretics · ACE inhibitors · Dehydration · Salt restriction (Li reabsorbed with Na)', '#b71c1c'),
]
))
story.append(sp(0.2))
story.append(mnemonic_box('Lithium Toxicity Levels — "The Tremor Gets Worse"', [
('Mild (1.5-2.0)', '→ Coarse tremor, nausea, diarrhea, drowsiness'),
('Moderate (2.0-2.5)', '→ Confusion, ataxia, dysarthria, lethargy'),
('Severe (>2.5)', '→ Seizures, coma, cardiac arrhythmias, death'),
('Rx', '→ IV Normal Saline (↑Na → ↑Li excretion) → Hemodialysis if level >4.0, seizures, or AKI'),
('AVOID', '→ Forced diuresis (paradoxically ↑Li reabsorption!)'),
], bg=LIGHT_ORANGE, border=ORANGE))
story.append(sp(0.3))
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════
# SECTION 6-7: CARDIOVASCULAR DRUGS
# ════════════════════════════════════════════════════════════════
story.append(section_header('SECTION 6: ACE INHIBITORS & ARBs', colors.HexColor('#00838f')))
story.append(sp(0.3))
story.append(flashcard(
'6. ACEi (-pril) vs ARBs (-sartan)',
colors.HexColor('#00838f'),
[
('ACEi Drugs', 'Lisinopril · Enalapril · Ramipril · Captopril | Mechanism: Block Ang I → Ang II + ↑Bradykinin', '#004d40'),
('ARB Drugs', 'Losartan · Valsartan · Irbesartan · Olmesartan | Mechanism: Block AT1 receptor (NO bradykinin effect → NO cough!)', '#004d40'),
('✅ USE', 'HTN (1st line) · HFrEF (MUST use!) · Post-MI · Diabetic nephropathy (1st line) · CKD with proteinuria', '#1b5e20'),
('🚫 AVOID', 'Bilateral RAS (→ acute renal failure) · PREGNANCY (fetal renal agenesis — Class D/X!) · Hyperkalemia · Angioedema history · Triple blockade (ACEi+ARB+DRI)', '#b71c1c'),
('ACEi UNIQUE SE', 'DRY COUGH (10-15% — due to ↑bradykinin) → switch to ARB | ANGIOEDEMA (life-threatening! can occur years later) → Rx: Epi IM + Icatibant', '#e65100'),
('Both SE', '↑Creatinine (expected — slight rise OK; >30% rise = STOP) · Hyperkalemia · First-dose hypotension', '#e65100'),
]
))
story.append(sp(0.3))
story.append(section_header('SECTION 7: DIURETICS', colors.HexColor('#558b2f')))
story.append(sp(0.3))
diuretic_data = [
[Paragraph('<b>Type</b>', s('h', fontSize=9, textColor=WHITE, fontName='Helvetica-Bold', alignment=TA_CENTER, leading=12)),
Paragraph('<b>Site</b>', s('h', fontSize=9, textColor=WHITE, fontName='Helvetica-Bold', alignment=TA_CENTER, leading=12)),
Paragraph('<b>Key Uses</b>', s('h', fontSize=9, textColor=WHITE, fontName='Helvetica-Bold', alignment=TA_CENTER, leading=12)),
Paragraph('<b>Electrolytes</b>', s('h', fontSize=9, textColor=WHITE, fontName='Helvetica-Bold', alignment=TA_CENTER, leading=12)),
Paragraph('<b>Unique SE / Notes</b>', s('h', fontSize=9, textColor=WHITE, fontName='Helvetica-Bold', alignment=TA_CENTER, leading=12))],
[small('Thiazide\n(HCTZ, Chlorthalidone)'), small('DCT'), small('HTN (1st line)\nCa stones prevention\nOsteoporosis\nNephrogenic DI (paradox!)'), small('↓K ↓Na ↓Mg\n↑Ca ↑Glucose\n↑Uric acid'), small('HyperGLUC mnemonic\nCI: Gout, sulfa allergy')],
[small('Loop\n(Furosemide, Torsemide)'), small('Loop of Henle\n(most potent!)'), small('Acute HF / pulmonary edema\nHypercalcemia\nASCITES, SIADH'), small('↓K ↓Na ↓Ca\n↓Mg (all down!)'), small('OTOTOXICITY (+ aminoglycosides!)\nEthacrynic acid: sulfa allergy safe')],
[small('K-Sparing\n(Spironolactone, Triamterene)'), small('Collecting Duct\n(ENaC / Aldosterone)'), small('HF mortality benefit\nCirrhosis ascites (1st line)\nPrimary hyperaldosteronism'), small('↑K (most important!)\nMetabolic acidosis'), small('Spiro: Gynecomastia (antiandrogen)\nEplerenone = fewer hormonal SEs')],
[small('Acetazolamide\n(CAI)'), small('PCT\n(↓HCO3 reabsorp)'), small('Glaucoma\nAltitude sickness\nMetabolic alkalosis'), small('↓K\nMetabolic acidosis'), small('Paresthesias (tingling - common!)\nKidney stones (alkaline urine)\nCI: Sulfa allergy, cirrhosis')],
]
diur_t = Table(diuretic_data, colWidths=[3.2*cm, 2*cm, 4*cm, 3.3*cm, 4.5*cm])
diur_t.setStyle(TableStyle([
('BACKGROUND',(0,0),(-1,0),colors.HexColor('#558b2f')),
('ROWBACKGROUNDS',(0,1),(-1,-1),[LIGHT_GREEN, WHITE]),
('GRID',(0,0),(-1,-1),0.5,colors.HexColor('#c8e6c9')),
('VALIGN',(0,0),(-1,-1),'TOP'),
('TOPPADDING',(0,0),(-1,-1),5), ('BOTTOMPADDING',(0,0),(-1,-1),5),
('LEFTPADDING',(0,0),(-1,-1),5), ('ROUNDEDCORNERS',[5]),
]))
story.append(diur_t)
story.append(sp(0.2))
story.append(mnemonic_box('Diuretic Electrolyte Memory Tricks', [
('Thiazides', '→ HyperGLUC: Hyperglycemia, Lipidemia, Uricemia (gout), Calcium↑ | LOSE: K, Na, Mg'),
('Loop', '→ "LOOPS lose everything": ↓Ca, ↓K, ↓Mg, ↓Na | OTOTOXIC (especially IV rapid + aminoglycosides)'),
('K-sparing', '→ "K-SPARING KEEPS Potassium" → HYPERKALEMIA is the main danger!'),
('Thiazide paradox', '→ Treats nephrogenic DI (volume depletion → ↑proximal reabsorption → ↓urine output)'),
], bg=LIGHT_GREEN, border=GREEN))
story.append(sp(0.3))
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════
# SECTIONS 8-13: CARDIO DRUGS
# ════════════════════════════════════════════════════════════════
story.append(section_header('SECTIONS 8–13: KEY CARDIAC DRUGS', colors.HexColor('#6a1b9a')))
story.append(sp(0.3))
# SGLT2
story.append(flashcard(
'8. SGLT2 Inhibitors (Gliflozins) — Empagliflozin, Dapagliflozin, Canagliflozin',
colors.HexColor('#1565c0'),
[
('Mechanism', 'Block SGLT2 in proximal tubule → glucosuria → ↓glucose + ↓Na reabsorption + ↓weight + ↓BP + ↓intraglomerular pressure', '#0d47a1'),
('✅ USE', 'T2DM (2nd line after Metformin) · HFrEF (reduces mortality even WITHOUT diabetes!) · HFpEF (Dapa/Empa) · CKD with proteinuria · CV risk reduction', '#1b5e20'),
('🚫 AVOID', 'T1DM (↑DKA risk) · eGFR <20-45 · Recurrent UTIs/genital infections · DKA · Pregnancy | STOP 3 DAYS before surgery!', '#b71c1c'),
('☠ KEY TOXICITY', 'EUGLYCEMIC DKA — Glucose may be NORMAL! (easy to miss!) | Sx: N/V, abdominal pain, Kussmaul breathing, ↑ketones, ↑anion gap | Fournier\'s gangrene (rare but surgical emergency!)', '#b71c1c'),
('Common SE', 'Genital mycotic infections (most common) · UTIs · Polyuria · Volume depletion/hypotension · AKI (with dehydration) · Bone fractures (Canagliflozin)', '#e65100'),
]
))
story.append(sp(0.2))
# Digoxin
story.append(flashcard(
'9. Digoxin — Narrow Therapeutic Index! (0.5–0.9 ng/mL)',
colors.HexColor('#795548'),
[
('Mechanism', 'Inhibits Na/K-ATPase → ↑intracellular Ca → ↑contractility (+ inotropy) | Also: ↑vagal tone → ↓HR (- chronotropy), ↓AV conduction', '#4e342e'),
('✅ USE', 'HFrEF (improves symptoms, ↓hospitalizations — NO mortality benefit) · AFib rate control (especially in HF) · Atrial flutter · SVT', '#1b5e20'),
('🚫 AVOID', 'WPW (→ accelerate accessory pathway → VF!) · 2nd/3rd degree AV block · HOCM · Hypokalemia (↑toxicity!) · Hypercalcemia (↑toxicity)', '#b71c1c'),
('Classic Toxicity Signs', 'GI: N/V/anorexia (EARLY signs!) | Visual: Yellow-green halos (classic!) | Cardiac: PAT with block · Bidirectional VT (PATHOGNOMONIC!) · Any arrhythmia', '#b71c1c'),
('Things that ↑Toxicity', '↓K · ↓Mg · ↑Ca · Renal failure · Quinidine · Amiodarone · Verapamil | ALL ↑digoxin levels!', '#e65100'),
('☠ ANTIDOTE', 'DIGOXIN IMMUNE FAB (Digibind/DigiFab) | Give if: Life-threatening arrhythmia · K+>5 · Level >10 ng/mL | AVOID cardioversion (→ VF!)', '#b71c1c'),
]
))
story.append(sp(0.2))
# CCBs
story.append(flashcard(
'10. Calcium Channel Blockers (CCBs)',
colors.HexColor('#37474f'),
[
('DHP (Amlodipine, Nifedipine)', 'Mainly VASCULAR → ↓BP, peripheral vasodilation | SE: Peripheral edema (ankles), flushing, reflex tachycardia', '#263238'),
('Non-DHP (Verapamil, Diltiazem)', 'Mainly CARDIAC → ↓HR, ↓AV conduction, ↓contractility | SE: Bradycardia, constipation (Verapamil), AV block', '#263238'),
('✅ USE', 'HTN (1st line) · Angina (all types) · AFib rate control (Non-DHP) · SVT (Verapamil IV) · Raynaud (Nifedipine) · Vasospasm post-SAH (Nimodipine)', '#1b5e20'),
('🚫 AVOID Non-DHP', 'Systolic HF (↓contractility) · AV block/bradycardia · WPW + AF (→VF!) · Combined with β-blockers (↑AV block) · Cardiogenic shock', '#b71c1c'),
('☠ CCB OD Rx', 'Calcium Chloride/Gluconate IV → HIGH-DOSE INSULIN + Dextrose (HIET — most effective!) → Glucagon → Lipid emulsion (Intralipid) → ECMO if refractory', '#b71c1c'),
]
))
story.append(sp(0.2))
# Nitrates + Beta Blockers (condensed)
story.append(flashcard(
'11. Nitrates — Release NO → ↑cGMP → Venodilation (↓preload) > Arteriodilation (↓afterload)',
colors.HexColor('#c62828'),
[
('Drugs', 'SL Nitroglycerin (acute angina) · IV NTG (acute HF, hypertensive emergency) · ISMN/ISDN (prophylaxis) · Nitroprusside (IV — hypertensive emergency)', '#b71c1c'),
('ABSOLUTE CI', 'PDE5 INHIBITORS (Sildenafil/Tadalafil) → SEVERE HYPOTENSION! Also: RV infarction! (preload-dependent) · HCM · Severe aortic stenosis', '#b71c1c'),
('SE', 'Headache (most common — pulsating) · Hypotension · Reflex tachycardia · TOLERANCE (need 10-12h nitrate-free window daily!)', '#e65100'),
('Methemoglobinemia', 'Chocolate-brown blood · Normal PaO2 · Low SpO2 | Rx: METHYLENE BLUE IV | G6PD deficiency → Methylene blue FAILS → Ascorbic acid', '#b71c1c'),
('Nitroprusside Cyanide Tox', 'Prolonged high-dose → lactic acidosis, ↑lactate | Rx: HYDROXYCOBALAMIN (preferred) or Na thiosulfate + Na nitrite', '#b71c1c'),
]
))
story.append(sp(0.2))
story.append(flashcard(
'12. Beta Blockers — Block β-adrenergic receptors → ↓HR, ↓contractility, ↓AV conduction, ↓renin',
colors.HexColor('#1a237e'),
[
('β1-selective', 'Metoprolol · Atenolol · Bisoprolol · Esmolol (IV — ultra-short acting)'),
('Non-selective', 'Propranolol · Nadolol · Timolol (glaucoma eye drops)'),
('α+β', 'Labetalol (IV for hypertensive emergency in pregnancy!) · Carvedilol (HF)'),
('✅ USE', 'HTN · Angina · Post-MI (MANDATORY! ↓mortality) · HFrEF (Carvedilol, Metoprolol, Bisoprolol) · AFib rate control · Essential tremor · Migraine prophylaxis · Thyroid storm · Portal HTN (Propranolol)', '#1b5e20'),
('🚫 AVOID', 'Asthma (non-selective) · AV block · Decompensated HF · Cocaine · Pheochromocytoma WITHOUT prior α-blockade first! · Never stop abruptly!', '#b71c1c'),
('MASKS hypoglycemia', 'Masks tachycardia and tremor (sweating preserved!) — WARN diabetic patients!', '#e65100'),
('☠ OD Rx', 'GLUCAGON IV (1st line — activates adenylyl cyclase bypassing β-receptor) → High-dose Insulin + Dextrose (HIET) → Calcium IV → Vasopressors → Pacing', '#b71c1c'),
]
))
story.append(sp(0.3))
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════
# SECTION 13: ANTIARRHYTHMICS
# ════════════════════════════════════════════════════════════════
story.append(section_header('SECTION 13: ANTIARRHYTHMICS (Vaughan Williams)', colors.HexColor('#4a148c')))
story.append(sp(0.3))
story.append(mnemonic_box('Class Memory Trick — "I Block Na, They Block K, She Blocks Ca"', [
('Class I', '→ Na+ channel blockers (IA, IB, IC)'),
('Class II', '→ β-blockers'),
('Class III', '→ K+ channel blockers (↑QT, ↑refractory period)'),
('Class IV', '→ Non-DHP Calcium channel blockers'),
('Class V', '→ Miscellaneous: Adenosine, Digoxin, Mg2+, Atropine'),
], bg=LIGHT_PURPLE, border=PURPLE))
story.append(sp(0.2))
antiarr_data = [
[Paragraph('<b>Class</b>', s('h', fontSize=9, textColor=WHITE, fontName='Helvetica-Bold', alignment=TA_CENTER, leading=12)),
Paragraph('<b>Drugs</b>', s('h', fontSize=9, textColor=WHITE, fontName='Helvetica-Bold', alignment=TA_CENTER, leading=12)),
Paragraph('<b>Key Use</b>', s('h', fontSize=9, textColor=WHITE, fontName='Helvetica-Bold', alignment=TA_CENTER, leading=12)),
Paragraph('<b>Key Toxicity / Notes</b>', s('h', fontSize=9, textColor=WHITE, fontName='Helvetica-Bold', alignment=TA_CENTER, leading=12))],
[small('IA\nNa block + K block\n↑QT'), small('Quinidine\nProcainamide\nDisopyramide'), small('VT · AF/flutter\nWPW (Procainamide)\nMalaria (Quinidine IV)'), small('⚠️ TORSADES DE POINTES (↑QT)\nProcainamide → Drug-induced LUPUS (antihistone Ab)\nQuinidine → Cinchonism (tinnitus, visual Δ)')],
[small('IB\nNa block\n↓QT'), small('Lidocaine (IV)\nMexiletine (oral)\nPhenytoin'), small('VT/VF post-MI (acute)\nDigoxin arrhythmias\nLocal anesthesia (Lido)'), small('CNS toxicity: Perioral numbness → Drowsiness → Seizures → Respiratory arrest\nRx: BZDs + Lipid emulsion')],
[small('IC\nStrong Na block\nNO effect on QT'), small('Flecainide\nPropafenone'), small('AF/flutter (ONLY\nstructurally normal\nheart!) "Pill-in-pocket"'), small('🚫 CI in STRUCTURAL HEART DISEASE!\nCAST trial: ↑mortality post-MI\nProarrhythmic: AF→ flutter with 1:1 conduction')],
[small('II'), small('β-blockers\n(see Section 12)'), small('Rate control AF/flutter\nPost-MI arrhythmias\nSVT prevention'), small('See Beta Blocker section')],
[small('III\nK block, ↑QT'), small('Amiodarone★\nSotalol\nDofetilide\nDronedarone'), small('Amiodarone: VT/VF (1st line)\nSotalol: AF maintenance\nDofetilide: AF/flutter'), small('Amiodarone: TOXIC TO EVERY ORGAN\n(see box below)\nAll Class III → TdP risk\nSotalol: TdP most common')],
[small('IV'), small('Verapamil\nDiltiazem'), small('SVT termination (IV Verapamil)\nAF/flutter rate control'), small('CI: WPW + AF! HF!\nAV block')],
[small('V\nMisc'), small('Adenosine\nMg Sulfate\nAtropine\nDigoxin'), small('Adenosine: DOC for SVT\nMg: TdP (DOC!)\nAtropine: Bradycardia'), small('Adenosine: half-life <10 sec, chest pain/flushing (brief!)\nCI: WPW with AF, Asthma\nMg toxicity → Ca Gluconate antidote')],
]
arr_t = Table(antiarr_data, colWidths=[2.5*cm, 3*cm, 4.5*cm, 7*cm])
arr_t.setStyle(TableStyle([
('BACKGROUND',(0,0),(-1,0),colors.HexColor('#4a148c')),
('ROWBACKGROUNDS',(0,1),(-1,-1),[LIGHT_PURPLE, WHITE]),
('GRID',(0,0),(-1,-1),0.5,colors.HexColor('#d1c4e9')),
('VALIGN',(0,0),(-1,-1),'TOP'),
('TOPPADDING',(0,0),(-1,-1),5), ('BOTTOMPADDING',(0,0),(-1,-1),5),
('LEFTPADDING',(0,0),(-1,-1),5), ('ROUNDEDCORNERS',[5]),
]))
story.append(arr_t)
story.append(sp(0.2))
story.append(mnemonic_box('AMIODARONE — "Toxic to EVERY Organ" (half-life 40-55 days!)', [
('Pulmonary', '→ Fibrosis / pneumonitis (most serious) → CT chest + PFTs → Steroids if diagnosed'),
('Hepatic', '→ Hepatotoxicity → Check LFTs regularly'),
('Thyroid', '→ BOTH hypo AND hyperthyroidism (iodine-rich!) → TFTs q6 months'),
('Eyes', '→ Corneal microdeposits (nearly universal, usually benign) → Annual eye exams'),
('Skin', '→ Blue-gray discoloration + photosensitivity → Sun protection (may be irreversible!)'),
('Drug interactions', '→ ↑Warfarin (reduce dose 30-50%) + ↑Digoxin + ↑Statin levels → monitor!'),
], bg=LIGHT_PURPLE, border=PURPLE))
story.append(sp(0.2))
story.append(flashcard(
'Torsades de Pointes (TdP) — Polymorphic VT with ↑QT Interval',
colors.HexColor('#880e4f'),
[
('Cause', 'QT-prolonging drugs: Class IA · Class III · Antipsychotics (Thioridazine, Ziprasidone) · TCA · Certain antibiotics (Azithromycin) · ↓K · ↓Mg', '#880e4f'),
('Rx Step 1', 'MAGNESIUM SULFATE IV (drug of choice — even if Mg is normal!)', '#1b5e20'),
('Rx Step 2', 'Overdrive pacing (temporary — increases rate to prevent pause-dependent TdP)', '#1b5e20'),
('Rx Step 3', 'Isoproterenol (↑rate) · Defibrillation if degenerates to VF', '#1b5e20'),
('AVOID', 'Other QT-prolonging drugs · Class IA/III antiarrhythmics · Correct electrolytes (K+, Mg++)', '#b71c1c'),
]
))
story.append(sp(0.3))
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════
# FINAL PAGE: ANTIDOTES QUICK REFERENCE
# ════════════════════════════════════════════════════════════════
story.append(section_header('QUICK ANTIDOTES & TOXICITY REFERENCE', RED))
story.append(sp(0.3))
antidote_data = [
[Paragraph('<b>Drug / Toxidrome</b>', s('h', fontSize=9.5, textColor=WHITE, fontName='Helvetica-Bold', alignment=TA_CENTER, leading=13)),
Paragraph('<b>Antidote / Treatment</b>', s('h', fontSize=9.5, textColor=WHITE, fontName='Helvetica-Bold', alignment=TA_CENTER, leading=13)),
Paragraph('<b>Key Notes</b>', s('h', fontSize=9.5, textColor=WHITE, fontName='Helvetica-Bold', alignment=TA_CENTER, leading=13))],
[small('Organophosphate\nCholinergic Crisis'), small('Atropine + Pralidoxime (2-PAM)'), small('Atropine = antidote | 2-PAM before "aging" (give EARLY!)')],
[small('Anticholinergic'), small('Physostigmine'), small('Crosses BBB → treats CNS delirium')],
[small('β-Blocker OD'), small('GLUCAGON IV → High-dose Insulin'), small('Glucagon bypasses β-receptor | HIET if refractory')],
[small('CCB Overdose'), small('Calcium IV + High-dose Insulin (HIET)'), small('HIET most effective; Lipid emulsion for lipophilic CCBs')],
[small('Digoxin Toxicity'), small('Digoxin Immune Fab (Digibind)'), small('K+>5 · level>10 · life-threatening arrhythmia = give Fab')],
[small('TCA Overdose'), small('Sodium Bicarbonate IV'), small('Narrows QRS; alkalinize to pH 7.45-7.55 | AVOID Flumazenil!')],
[small('Serotonin Syndrome'), small('Cyproheptadine + Stop drug'), small('5-HT antagonist; BZDs for agitation; active cooling')],
[small('NMS'), small('Dantrolene + Bromocriptine'), small('Dantrolene = muscle relaxant; Bromocriptine = DA agonist')],
[small('Lithium Toxicity'), small('Hemodialysis (if severe)'), small('IV NS first; HD if level >4.0, seizures, or AKI')],
[small('Torsades de Pointes'), small('Magnesium Sulfate IV'), small('Even if Mg is normal! + Overdrive pacing')],
[small('Methemoglobinemia'), small('Methylene Blue IV'), small('G6PD deficiency → Methylene Blue FAILS → Ascorbic acid')],
[small('Nitroprusside (Cyanide)'), small('Hydroxycobalamin'), small('Preferred; Na thiosulfate + Na nitrite = alternative')],
[small('Opioid OD'), small('Naloxone'), small('Repeat doses; infusion for long-acting opioids')],
[small('Benzodiazepine OD'), small('Flumazenil (CAUTION!)'), small('AVOID if: TCA OD · Seizure history → can precipitate seizures!')],
[small('Acetaminophen OD'), small('N-Acetylcysteine (NAC)'), small('Best within 8-10 hrs of ingestion')],
[small('Warfarin OD'), small('Vitamin K + 4-Factor PCC (or FFP)'), small('PCC = fastest reversal; FFP = if PCC unavailable')],
[small('Heparin OD'), small('Protamine Sulfate'), small('1mg neutralizes ~100 units UFH')],
[small('Hypermagnesemia'), small('Calcium Gluconate IV'), small('Monitor DTRs (loss ~5 mEq/L) → Dialysis if severe')],
]
antidote_t = Table(antidote_data, colWidths=[4*cm, 5.5*cm, 7.5*cm])
antidote_t.setStyle(TableStyle([
('BACKGROUND',(0,0),(-1,0),colors.HexColor('#b71c1c')),
('ROWBACKGROUNDS',(0,1),(-1,-1),[LIGHT_RED, WHITE]),
('GRID',(0,0),(-1,-1),0.5,colors.HexColor('#ffcdd2')),
('VALIGN',(0,0),(-1,-1),'MIDDLE'),
('TOPPADDING',(0,0),(-1,-1),5), ('BOTTOMPADDING',(0,0),(-1,-1),5),
('LEFTPADDING',(0,0),(-1,-1),7), ('ROUNDEDCORNERS',[5]),
]))
story.append(antidote_t)
story.append(sp(0.3))
story.append(mnemonic_box('KEY ANTIDOTE MNEMONICS', [
('"GANG" for OD Rx', '→ Glucagon (β-blocker) · Atropine (organophosphate) · NAC (acetaminophen) · Gluconate-Ca (CCB/Mg)'),
('"Physo vs Neo"', '→ Physostigmine crosses BBB (use for anticholinergic CNS delirium) | Neostigmine stays peripheral (use for MG/NMB reversal)'),
('"Bicarb for TCA"', '→ Sodium Bicarb narrows QRS in TCA OD by alkalinizing + binding drug | Also works for Class IC toxicity'),
('"Flumazenil is Dangerous"', '→ Avoid Flumazenil if: TCA co-ingestion (seizures!) · Chronic BZD user (precipitates withdrawal seizures)'),
('"Digibind = Dig level >10"', '→ Or K+>5, or life-threatening arrhythmia → give Digibind | Avoid cardioversion in digoxin toxicity (→ VF!)'),
], bg=LIGHT_YELLOW, border=YELLOW))
# footer
story.append(sp(0.3))
data_footer = [[Paragraph('📚 Pharmacology Quick Review Study Guide | Good luck on your exam! 💪',
s('f', fontSize=9, textColor=WHITE, fontName='Helvetica-Bold', alignment=TA_CENTER, leading=14))]]
t_footer = Table(data_footer, colWidths=[17*cm])
t_footer.setStyle(TableStyle([('BACKGROUND',(0,0),(-1,-1),NAVY),('TOPPADDING',(0,0),(-1,-1),8),('BOTTOMPADDING',(0,0),(-1,-1),8),('ROUNDEDCORNERS',[5])]))
story.append(t_footer)
doc.build(story)
print("PDF created successfully!")
PYEOF
python3 /home/daytona/workspace/pharm-study-guide/make_pdf.py
show command