Brachial Plexus & Upper Limb Nerve Injuries (Tested in 100% of sessions)The Trend: 10 years ago, NBE asked for the root values of nerves. Today, they give you a clinical scenario of a factory worker with a humeral shaft fracture or a newborn with a difficult delivery.The Core Repeating Images:Erb’s Palsy: Waiter's tip hand position (Injury to Upper Trunk, C5-C6).Klumpke’s Palsy: Claw hand appearance (Injury to Lower Trunk, C8-T1).Radial Nerve Injury: Saturday night palsy / Wrist drop from mid-shaft humerus fractures.Anatomical Snuffbox: Tendon boundaries and tenderness over the scaphoid bone.

| Level | Components |
|---|---|
| Roots | C5, C6, C7, C8, T1 |
| Trunks | Upper (C5+C6), Middle (C7), Lower (C8+T1) |
| Divisions | Anterior (flexors) & Posterior (extensors) from each trunk |
| Cords | Lateral, Posterior, Medial (named relative to axillary artery) |
| Terminal Branches | Musculocutaneous, Axillary, Radial, Median, Ulnar |

"Erb palsy: affects C5-6 nerve roots. Common with vaginal delivery and traction-type injury, leading to adduction, internal rotation of the shoulder, inability to flex the elbow, wrist and digital flexion/extension intact. Over 90% have resolution at 3 months of age. Biceps function is the prognostic indicator." - Miller's Review of Orthopaedics, 9th Ed.
"Lower type of brachial plexopathy (Déjerine-Klumpke type) results from injury to the eighth cervical and first thoracic roots or the lower trunk... When the first thoracic root is injured, the sympathetic fibers are interrupted. Therefore, an ipsilateral Horner syndrome (ptosis, miosis, and anhidrosis) results." - Localization in Clinical Neurology, 8th Ed.
| Erb's Palsy | Klumpke's Palsy | |
|---|---|---|
| Roots | C5-C6 | C8-T1 |
| Trunk | Upper trunk | Lower trunk |
| Classic cause | Shoulder dystocia / delivery | Hyperabduction traction |
| Posture | Waiter's/Bellman's tip | Claw hand |
| Hands/fingers | Spared | Affected (main deficit) |
| Shoulder/elbow | Affected (main deficit) | Spared |
| Horner's | No | Yes (if T1 proximal injury) |
| Frequency | Common (~20x more common) | Rare |
"If you have a patient with a humeral shaft fracture, check the patient for wrist drop. Most radial nerve injuries are neuropraxias, or stretching of the nerve." - Schwartz's Principles of Surgery, 11th Ed.
| Border | Structure |
|---|---|
| Lateral (radial/anterior) | Tendons of Abductor Pollicis Longus (APL) + Extensor Pollicis Brevis (EPB) |
| Medial (posterior/ulnar) | Tendon of Extensor Pollicis Longus (EPL) |
| Floor | Scaphoid + Trapezium + distal ECRL + ECRB tendons |
| Roof | Skin |
"When the hand is in ulnar deviation, the scaphoid becomes palpable within the snuffbox. This position enables the physician to palpate the bone to assess for a fracture." - Gray's Anatomy for Students
| Clinical Scenario | Injury | Nerve/Level |
|---|---|---|
| Newborn, shoulder dystocia, arm hangs/internally rotated | Erb's palsy | Upper trunk C5-C6 |
| Fall from tree, grabs branch, claw hand | Klumpke's palsy | Lower trunk C8-T1 |
| Klumpke's + drooping eyelid/small pupil | Klumpke's + Horner's | T1 proximal root |
| Drunk, woke up with wrist drop, no fracture | Saturday night palsy | Radial nerve, spiral groove |
| Mid-shaft humerus fracture + wrist drop | Radial nerve injury | Spiral groove (mid-humerus) |
| FOOSH + snuffbox tenderness, normal X-ray | Scaphoid fracture (occult) | - |
| Proximal humerus fracture + deltoid weakness | Axillary nerve injury | Surgical neck |
| Mastectomy/stab wound + winged scapula | Long thoracic nerve | C5-C7 |
| Apical lung tumor + Horner's + claw hand | Pancoast syndrome | Lower trunk C8-T1 + T1 sympathetics |
Is this everything needed for fmge exam from this topic
FMGE brachial plexus upper limb nerve injuries important topics 2024 2025
| Posture | Nerve / Situation | Mechanism |
|---|---|---|
| Waiter's Tip / Bellman's Tip | Upper trunk C5-C6 (Erb's palsy) | Adduction + internal rotation + extended elbow |
| Claw Hand | Ulnar nerve at wrist OR lower trunk (Klumpke's) | MCP extension + IP flexion of ring & little fingers |
| Wrist Drop | Radial nerve (spiral groove) | Wrist + finger extensors paralyzed |
| Hand of Benediction / Preacher's Hand | Proximal median nerve (above elbow) | When patient ATTEMPTS to make a fist - index & middle fingers stay extended because FDP-1,2 + FPL are lost |
| Ape Hand / Simian Hand | Chronic median + ulnar nerve combined | Thenar + hypothenar wasting, thumb falls into plane of palm (can't oppose) |
| Pope's Blessing / Oath Hand | Proximal median nerve at rest | Index + middle fingers extended at rest (opposite of claw - confused by many) |
"All ulnar claws: the more distal the lesion, the more pronounced the claw" - Miller's Review of Orthopaedics
| Feature | Spiral Groove Injury | PIN Injury (at radial tunnel) |
|---|---|---|
| Wrist drop | Present | Partial - ECRL spared (it branches before PIN) |
| Triceps | Spared (branches before spiral groove) | Spared |
| Wrist extension | Lost | ECRL works - wrist extends but deviates radially |
| Finger extension | Lost | Lost |
| Sensory loss | Present (dorsal lateral hand) | None (PIN is purely motor) |
| Brachioradialis | Intact | Intact |
"Paralysis of the serratus anterior caused by damage to the long thoracic nerve produces a winged scapula on the affected side, making it impossible to raise the arm laterally past 90°" - Color Atlas of Human Anatomy, Thieme
| Feature | Preganglionic (Root Avulsion) | Postganglionic |
|---|---|---|
| Site | Nerve root avulsed from spinal cord | Nerve torn distal to DRG |
| Histamine test | Flare PRESENT (axon still intact to skin) | Flare ABSENT |
| Horner's syndrome | Present (if C8-T1 involved) | Usually absent |
| Paraspinal muscles | Denervated on EMG | Normal |
| Sensory evoked potentials | Preserved (DRG intact) | Absent |
| Prognosis | Worse - nerve grafting NOT possible | Better - grafting/repair possible |
| Cervical myelogram/MRI | Shows pseudomeningocele | Normal |
| Phrenic nerve palsy | Often co-exists (elevated hemidiaphragm on CXR) | Usually absent |
"Test sensation in the upper part of the lateral aspect of the arm ('regimental badge area'). Loss may indicate damage to the axillary nerve (following shoulder dislocation)." - Bailey and Love's Surgery, 28th Ed.
| Nerve | Key Injury Level | Classic Mechanism | Motor Loss | Sensory Loss | Named Sign/Posture |
|---|---|---|---|---|---|
| Upper trunk C5-C6 | Erb's palsy | Birth trauma / shoulder depression | Deltoid, biceps, supraspinatus, wrist ext | Lateral arm + forearm | Waiter's tip |
| Lower trunk C8-T1 | Klumpke's palsy | Hyperabduction traction | Intrinsics, wrist/finger flexors | Medial arm, ulnar hand | Claw hand + Horner's |
| Radial (spiral groove) | Saturday night palsy / humeral shaft # | Compression/fracture | Wrist + finger extensors | Dorsal lateral hand | Wrist drop |
| Radial (axilla) | Crutch palsy | Axillary crutch | + Triceps weak | Same | Wrist drop + absent triceps reflex |
| PIN (radial tunnel) | Radial head # / entrapment | - | Finger extensors; ECRL spared | None | Finger drop, radial deviation on wrist ext |
| Median (high, above elbow) | Supracondylar # humerus | Children | FDP-1,2; FPL; pronation; LOAF | Lateral 3.5 fingers + lat palm | Hand of benediction (on fist) |
| Median AIN | Forearm entrapment | - | FDP-1,2; FPL only | None | Can't make "OK" sign |
| Median (wrist - CTS) | Carpal tunnel | Repetitive use / pregnancy etc. | LOAF only | Lateral 3.5 fingers (NOT thenar eminence) | Thenar wasting; Tinel's + Phalen's |
| Ulnar (elbow) | Cubital tunnel | Medial epicondyle fracture, leaning | FCU, FDP-4,5, intrinsics | Ulnar 1.5 fingers, med palm + dorsum | Claw (ring+little), Froment's, Wartenberg's |
| Ulnar (wrist) | Guyon's canal | Cyclist / hamate fracture | Intrinsics only (FCU, FDP-4,5 spared) | Variable / none if deep branch only | Worse claw (ulnar paradox) |
| Axillary | Surgical neck humerus / shoulder dislocation | - | Deltoid, teres minor | Regimental badge area | Shoulder abduction lost |
| Long thoracic (C5-7) | Axillary surgery / carrying loads | - | Serratus anterior | None | Winged scapula; arm can't go >90° |
| Musculocutaneous | Lateral cord / shoulder dislocation | - | Biceps, brachialis | Lateral forearm | Weak elbow flexion + supination |
Can u combine all this and make it into a pdf??
ls -la /home/daytona/workspace/ 2>/dev/null || echo "workspace empty or missing"
mkdir -p /home/daytona/workspace/brachial-plexus-pdf && python3 -c "import repor…
~/brachial-plexus-pdf/generate_pdf.py
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, KeepTogether, PageBreak
)
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import mm, cm
from reportlab.lib import colors
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import ListFlowable, ListItem
# ── Output path ───────────────────────────────────────────────────────────────
OUTPUT = "/home/daytona/workspace/brachial-plexus-pdf/Brachial_Plexus_Upper_Limb_Nerve_Injuries_FMGE.pdf"
# ── Colour palette ────────────────────────────────────────────────────────────
DARK_BLUE = colors.HexColor("#1a3a5c")
MED_BLUE = colors.HexColor("#2e6da4")
LIGHT_BLUE = colors.HexColor("#dce9f5")
ACCENT_GOLD = colors.HexColor("#e8a020")
LIGHT_GOLD = colors.HexColor("#fdf3df")
LIGHT_GRAY = colors.HexColor("#f4f6f8")
RED_WARN = colors.HexColor("#c0392b")
GREEN_OK = colors.HexColor("#1d7a3a")
WHITE = colors.white
BLACK = colors.black
TABLE_HDR = colors.HexColor("#1a3a5c")
TABLE_ALT = colors.HexColor("#eaf1fa")
# ── Document ──────────────────────────────────────────────────────────────────
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
leftMargin=18*mm, rightMargin=18*mm,
topMargin=22*mm, bottomMargin=22*mm,
title="Brachial Plexus & Upper Limb Nerve Injuries – FMGE Master Notes",
author="Orris AI",
)
W = A4[0] - 36*mm # usable width
# ── Styles ────────────────────────────────────────────────────────────────────
base = getSampleStyleSheet()
def style(name, parent="Normal", **kw):
s = ParagraphStyle(name, parent=base[parent], **kw)
return s
S = {
"cover_title": style("cover_title", "Title",
fontSize=26, textColor=WHITE, leading=32,
alignment=TA_CENTER, spaceAfter=6),
"cover_sub": style("cover_sub", "Normal",
fontSize=13, textColor=LIGHT_BLUE, leading=18,
alignment=TA_CENTER, spaceAfter=4),
"cover_tag": style("cover_tag", "Normal",
fontSize=10, textColor=ACCENT_GOLD, leading=14,
alignment=TA_CENTER),
"h1": style("h1", "Heading1",
fontSize=15, textColor=WHITE, leading=20,
backColor=DARK_BLUE, spaceBefore=14, spaceAfter=4,
leftIndent=-4, rightIndent=-4,
borderPad=6),
"h2": style("h2", "Heading2",
fontSize=12, textColor=DARK_BLUE, leading=16,
spaceBefore=10, spaceAfter=3,
borderPad=2),
"h3": style("h3", "Heading3",
fontSize=10.5, textColor=MED_BLUE, leading=14,
spaceBefore=7, spaceAfter=2),
"body": style("body", "Normal",
fontSize=9.5, leading=14, spaceAfter=4,
alignment=TA_JUSTIFY),
"bullet": style("bullet", "Normal",
fontSize=9.5, leading=13, leftIndent=14,
bulletIndent=4, spaceAfter=2),
"warn": style("warn", "Normal",
fontSize=9.5, leading=13,
backColor=LIGHT_GOLD, borderPad=6,
textColor=colors.HexColor("#7a4800"),
spaceAfter=6),
"tip": style("tip", "Normal",
fontSize=9.5, leading=13,
backColor=colors.HexColor("#e8f5e9"), borderPad=6,
textColor=GREEN_OK,
spaceAfter=6),
"quote": style("quote", "Normal",
fontSize=9, leading=13, leftIndent=12, rightIndent=12,
textColor=colors.HexColor("#444444"), fontName="Helvetica-Oblique",
spaceAfter=4),
"footer": style("footer", "Normal",
fontSize=8, textColor=colors.HexColor("#888888"),
alignment=TA_CENTER),
"toc_entry": style("toc_entry", "Normal",
fontSize=10, leading=16, textColor=DARK_BLUE),
"section_num": style("section_num", "Normal",
fontSize=9, textColor=MED_BLUE, leading=12, spaceAfter=1),
}
# ── Helpers ───────────────────────────────────────────────────────────────────
def H1(txt):
return [Paragraph(f"<b>{txt}</b>", S["h1"]), Spacer(1, 3*mm)]
def H2(txt):
return [Paragraph(txt, S["h2"]), HRFlowable(width="100%", thickness=1,
color=MED_BLUE, spaceAfter=2)]
def H3(txt):
return [Paragraph(f"<b>{txt}</b>", S["h3"])]
def P(txt):
return [Paragraph(txt, S["body"])]
def Warn(txt):
return [Paragraph(f"⚠ <b>Exam Trap:</b> {txt}", S["warn"])]
def Tip(txt):
return [Paragraph(f"✔ <b>High-Yield:</b> {txt}", S["tip"])]
def Quote(txt):
return [Paragraph(f'"{txt}"', S["quote"])]
def bullets(items):
out = []
for it in items:
out.append(Paragraph(f"• {it}", S["bullet"]))
return out
def sp(n=4):
return [Spacer(1, n*mm)]
def hr():
return [HRFlowable(width="100%", thickness=0.5, color=colors.HexColor("#cccccc"), spaceAfter=4)]
def table(data, col_widths=None, hdr_rows=1, alt=True):
t = Table(data, colWidths=col_widths, repeatRows=hdr_rows)
style_cmds = [
("BACKGROUND", (0,0), (-1, hdr_rows-1), TABLE_HDR),
("TEXTCOLOR", (0,0), (-1, hdr_rows-1), WHITE),
("FONTNAME", (0,0), (-1, hdr_rows-1), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("LEADING", (0,0), (-1,-1), 11),
("ALIGN", (0,0), (-1,-1), "LEFT"),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#aaaaaa")),
("ROWBACKGROUNDS", (0, hdr_rows), (-1,-1),
[TABLE_ALT, WHITE] if alt else [WHITE]),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0),(-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 5),
("RIGHTPADDING",(0,0), (-1,-1), 5),
]
t.setStyle(TableStyle(style_cmds))
return [t, Spacer(1, 4*mm)]
# ── Cover page ────────────────────────────────────────────────────────────────
def cover_block():
cover_bg = Table(
[[Paragraph("<b>Brachial Plexus &</b>", S["cover_title"]),],
[Paragraph("<b>Upper Limb Nerve Injuries</b>", S["cover_title"]),],
[Spacer(1,4*mm)],
[Paragraph("Complete FMGE / NBE Master Notes", S["cover_sub"])],
[Paragraph("Anatomy • Clinical Scenarios • Exam Traps • Quick-Reference Tables", S["cover_tag"])],
[Spacer(1,8*mm)],
[Paragraph("Compiled from Gray's Anatomy for Students • Miller's Review of Orthopaedics 9e •<br/>"
"Neuroanatomy through Clinical Cases 3e • Localization in Clinical Neurology 8e •<br/>"
"Schwartz's Principles of Surgery 11e • Bailey & Love 28e • THIEME Atlas",
S["cover_tag"])],
],
colWidths=[W],
)
cover_bg.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), DARK_BLUE),
("TOPPADDING", (0,0), (-1,-1), 10),
("BOTTOMPADDING",(0,0),(-1,-1), 10),
("LEFTPADDING", (0,0), (-1,-1), 16),
("RIGHTPADDING",(0,0),(-1,-1), 16),
("ROUNDEDCORNERS", [6]),
]))
return [Spacer(1, 20*mm), cover_bg, PageBreak()]
# ── Story builder ─────────────────────────────────────────────────────────────
story = []
story += cover_block()
# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 1 – BRACHIAL PLEXUS FRAMEWORK
# ═══════════════════════════════════════════════════════════════════════════════
story += H1("1. Brachial Plexus Framework")
story += P("The brachial plexus arises from anterior rami of spinal roots C5–T1 and organises "
"into the following levels. Mnemonic: <b>Randy Travis Drinks Cold Beer</b> "
"(Roots → Trunks → Divisions → Cords → Branches).")
story += sp(2)
plexus_data = [
["Level", "Components", "Key Notes"],
["Roots", "C5, C6, C7, C8, T1", "Anterior primary rami exiting between scalene muscles"],
["Trunks", "Upper (C5+C6) | Middle (C7) | Lower (C8+T1)", "Above clavicle (supraclavicular)"],
["Divisions", "Anterior (flexors) & Posterior (extensors)\nfrom each trunk", "No named terminal branches at this level"],
["Cords", "Lateral | Posterior | Medial\n(named relative to axillary artery)", "Below clavicle (infraclavicular)"],
["Branches", "Musculocutaneous, Axillary, Radial, Median, Ulnar\n(+ many smaller named branches)", "Terminal nerves of the upper limb"],
]
story += table(plexus_data, col_widths=[30*mm, 85*mm, 52*mm])
story += H2("Pre-divisional Branches (frequently tested in isolation)")
pre_data = [
["Nerve", "Origin", "Muscle(s)", "Injury Sign"],
["Long thoracic n.", "C5, C6, C7 (roots)", "Serratus anterior", "Winged scapula; arm can't raise >90°"],
["Dorsal scapular n.", "C5 (root)", "Rhomboids + Levator scapulae", "Scapula not retracted; winging (medial)"],
["Suprascapular n.", "Upper trunk (C5, C6)", "Supraspinatus + Infraspinatus", "Weak abduction initiation + external rotation"],
["Nerve to subclavius", "Upper trunk (C5, C6)", "Subclavius", "Clinically silent (rarely tested)"],
["Phrenic nerve (C3-5)", "Root level (C3–5)", "Diaphragm", "Elevated hemidiaphragm — marker of root avulsion"],
]
story += table(pre_data, col_widths=[38*mm, 32*mm, 42*mm, 55*mm])
# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 2 – ERB'S PALSY
# ═══════════════════════════════════════════════════════════════════════════════
story += H1("2. Erb's Palsy (Upper Trunk Injury — C5, C6)")
story += H2("Mechanism & Causes")
story += bullets([
"<b>Neonatal:</b> Shoulder dystocia during difficult vaginal delivery — forced depression of shoulder with lateral head flexion",
"<b>Adult:</b> Motorcycle accident, glenohumeral dislocation — sudden shoulder depression / traction",
"<b>Iatrogenic:</b> Improper arm positioning under anaesthesia",
])
story += H2("Muscles Lost (C5–C6 innervated)")
story += bullets([
"Deltoid (abduction lost)",
"Biceps brachii (elbow flexion + forearm supination lost)",
"Supraspinatus (abduction initiation lost)",
"Infraspinatus + Teres minor (external rotation lost)",
"Brachioradialis (partial elbow flexion loss)",
"Wrist extensors (partially affected)",
])
story += H2("Classic Posture")
story += P("<b>Waiter's Tip / Bellman's Tip:</b> Arm hangs adducted and internally rotated at the side, "
"elbow extended, forearm pronated, wrist slightly flexed. <b>Finger and hand movements are "
"relatively spared</b> (key differentiating point — rules out complete plexus injury).")
story += H2("Prognosis")
story += bullets([
"Over <b>90% of neonatal cases</b> resolve by 3 months of age",
"<b>Biceps function at 3 months = the key prognostic indicator</b>",
"If biceps not recovered by 3–6 months → surgical exploration ± nerve grafting considered",
"Severity grading: neuropraxia (best) → axonotmesis → neurotmesis (worst)",
])
story += Tip("Erb's palsy is ~20 times more common than Klumpke's palsy.")
story += sp(2)
# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 3 – KLUMPKE'S PALSY
# ═══════════════════════════════════════════════════════════════════════════════
story += H1("3. Klumpke's Palsy (Lower Trunk Injury — C8, T1)")
story += H2("Mechanism & Causes")
story += bullets([
"Forcible <b>hyperabduction</b> of the arm — grabbing a branch during a fall",
"<b>Pancoast tumour</b> (apical lung carcinoma) invading the lower plexus",
"Thoracic outlet syndrome (compression between clavicle and 1st rib)",
"Sudden upward traction on the arm",
])
story += H2("Muscles Lost (C8–T1 innervated)")
story += bullets([
"All intrinsic hand muscles: interossei, lumbricals, thenar + hypothenar groups",
"Flexor digitorum profundus to ring + little (C8 component)",
"Wrist/finger flexors (partial)",
])
story += H2("Classic Posture & Signs")
story += bullets([
"<b>Claw hand:</b> MCP hyperextension (intrinsics lost) + IP joint flexion (long flexors intact)",
"Thenar and hypothenar wasting",
"Sensory loss on medial arm, medial forearm, and ulnar aspect of hand",
"<b>Depressed / absent finger flexor reflex (C8–T1)</b>",
])
story += H2("Horner's Syndrome Association")
story += P("When <b>T1 root is injured proximal to the sympathetic trunk</b>, sympathetic fibres "
"destined for the superior cervical ganglion are interrupted → "
"<b>ipsilateral ptosis + miosis + anhidrosis</b>.")
story += Tip("Presence of Horner's syndrome in a claw hand patient = preganglionic T1 root "
"lesion (not just peripheral ulnar/median neuropathy).")
story += H2("Erb's vs. Klumpke's — Comparison")
comp_data = [
["Feature", "Erb's Palsy", "Klumpke's Palsy"],
["Roots", "C5–C6", "C8–T1"],
["Trunk", "Upper trunk", "Lower trunk"],
["Classic cause", "Shoulder dystocia / depression", "Hyperabduction traction"],
["Classic posture", "Waiter's tip", "Claw hand"],
["Hands/fingers", "Spared (main differentiator)", "Affected (main deficit)"],
["Shoulder/elbow", "Affected (main deficit)", "Spared"],
["Horner's syndrome", "No", "Yes (if T1 proximal injury)"],
["Frequency", "Common (~20× more frequent)", "Rare"],
["Prognosis", ">90% neonatal resolution at 3m", "Less predictable"],
]
story += table(comp_data, col_widths=[38*mm, 60*mm, 60*mm])
# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 4 – RADIAL NERVE
# ═══════════════════════════════════════════════════════════════════════════════
story += H1("4. Radial Nerve Injuries")
story += H2("Course of the Radial Nerve (High-Yield)")
story += bullets([
"Arises from <b>posterior cord</b> (C5–C8, T1)",
"Exits axilla → enters <b>spiral groove (radial groove)</b> of humerus posterolaterally",
"Winds around the lateral humerus → enters forearm between brachialis and brachioradialis",
"Splits at the radial tunnel into: <b>superficial branch</b> (sensory only) and "
"<b>posterior interosseous nerve / PIN</b> (motor only)",
])
story += H2("A. Axillary / Proximal Injury — Crutch Palsy")
story += bullets([
"<b>Cause:</b> Improper axillary crutch use — compresses nerve in axilla",
"<b>Signs:</b> Wrist drop + finger drop + <b>triceps weakness</b> + absent triceps reflex",
"Sensory loss: dorsolateral hand + posterior forearm + lateral arm",
])
story += H2("B. Spiral Groove Injury — Saturday Night Palsy / Humeral Shaft Fracture")
story += bullets([
"<b>Saturday night palsy:</b> Patient falls asleep drunk with arm over chair/bench — "
"compression in spiral groove. Also 'Honeymoon palsy' (arm over partner's shoulder).",
"<b>Humeral shaft fracture:</b> ~22% of mid-shaft humeral fractures injure the radial nerve",
"<b>Key sign: Wrist drop</b> (weakness of wrist + finger extensors)",
"Triceps is <b>spared</b> (branches off before spiral groove in most cases)",
"Sensory loss: dorsal lateral hand (superficial branch territory)",
])
story += Warn("Wrist drop causes mechanical disadvantage. Testing interossei with wrist "
"dropped may show false ulnar weakness. Fix: place palm flat on a surface, then retest.")
story += H2("Prognosis & Management")
story += bullets([
"Most humeral shaft radial nerve injuries are <b>neuropraxias</b> — spontaneous resolution 60–92%",
"Saturday night palsy (demyelinative): recovery typically within <b>6–8 weeks</b>",
"Axon-loss injuries: slower but most eventually recover",
"Management: wrist splint at ~60° dorsiflexion while awaiting recovery; EMG at 6–8 weeks",
"Surgical exploration if no recovery by 3–4 months, or if nerve entrapped in complex fracture",
])
story += H2("C. Posterior Interosseous Nerve (PIN) — Radial Tunnel Syndrome")
story += bullets([
"<b>Cause:</b> Radial head fracture, lipoma/ganglion at radial tunnel, Monteggia fracture, "
"repetitive forearm rotation",
"PIN is a <b>purely motor</b> branch — NO sensory loss",
"ECRL is spared (branches before PIN) → wrist extends but <b>deviates radially</b>",
"Finger extension lost; brachioradialis + triceps intact",
])
pin_data = [
["Feature", "Spiral Groove Injury", "PIN Injury (radial tunnel)"],
["Triceps", "Spared (usually)", "Spared"],
["Wrist extension", "Lost (wrist drop)", "Present but radially deviated (ECRL works)"],
["Finger extension", "Lost", "Lost"],
["Sensory loss", "Dorsal lateral hand", "NONE (purely motor)"],
["Brachioradialis", "Intact", "Intact"],
["Classic cause", "Humeral shaft fracture", "Radial head Fx / Monteggia Fx"],
]
story += table(pin_data, col_widths=[38*mm, 65*mm, 55*mm])
story += Tip("Finger drop without sensory loss = PIN injury. Wrist drop with sensory loss = spiral groove injury.")
# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 5 – MEDIAN NERVE
# ═══════════════════════════════════════════════════════════════════════════════
story += H1("5. Median Nerve Injuries")
story += H2("A. High Median Nerve (Above Elbow) — Supracondylar Fracture")
story += bullets([
"<b>Classic paediatric scenario:</b> Supracondylar fracture of humerus (anterior fragment injures median nerve)",
"Also: dislocation of elbow, stab wounds to arm",
])
story += P("<b>Muscles lost:</b>")
story += bullets([
"Pronator teres, pronator quadratus (pronation weak)",
"FCR, palmaris longus (wrist flexion weak)",
"FDS (all fingers)",
"FDP to index + middle fingers (AIN territory)",
"FPL (AIN territory)",
"LOAF muscles of hand (see CTS below)",
])
story += P("<b>Key sign: Hand of Benediction / Preacher's Hand</b> — when patient ATTEMPTS to make "
"a fist: index and middle fingers remain extended (FDP-1,2 + FPL paralysed). "
"Ring + little fingers can flex (FDP-3,4 from ulnar nerve intact).")
story += P("<b>Sensory loss:</b> Lateral 3.5 fingers + lateral palm (not thenar eminence — "
"palmar cutaneous branch exits above wrist).")
story += H2("B. Anterior Interosseous Nerve (AIN) Syndrome")
story += bullets([
"AIN is a purely <b>motor</b> branch of the median nerve in the forearm",
"Causes: forearm trauma, fibrous band entrapment",
"Muscles lost: FDP to index+middle, FPL, pronator quadratus",
"<b>NO sensory loss</b>",
"<b>Test:</b> Ask patient to make 'OK' circle with thumb and index finger — "
"unable to form a circle, shows 'pinch sign' instead",
])
story += Tip("AIN palsy = can't make the OK sign. No sensory loss. Purely motor.")
story += H2("C. Carpal Tunnel Syndrome (CTS) — Wrist Level")
story += P("<b>Most common nerve compression syndrome in the body.</b> Median nerve compressed "
"under the flexor retinaculum.")
story += P("<b>Classic scenario:</b> Middle-aged woman, bilateral hand tingling worse at night, "
"relieved by shaking the hand (<b>flick sign</b>).")
story += P("<b>Associations:</b> Pregnancy, hypothyroidism, diabetes, acromegaly, rheumatoid "
"arthritis, repetitive wrist use, Colles' fracture, obesity.")
story += P("<b>Muscles lost (LOAF mnemonic):</b>")
story += bullets([
"<b>L</b>umbricals 1 & 2",
"<b>O</b>pponens pollicis",
"<b>A</b>bductor pollicis brevis (best single muscle to test)",
"<b>F</b>lexor pollicis brevis (superficial head)",
])
story += P("<b>Key spared functions at wrist level:</b>")
story += bullets([
"Wrist flexion (FCR branches off proximal to tunnel)",
"Thenar eminence sensation (palmar cutaneous branch exits before tunnel)",
"Index/middle DIP flexion (FDP branches off proximal to tunnel)",
"<b>No hand of benediction</b> (that requires high lesion)",
])
story += P("<b>Provocative tests:</b>")
story += bullets([
"<b>Tinel's sign:</b> Tapping over carpal tunnel at wrist → tingling in fingers",
"<b>Phalen's test:</b> Forced wrist flexion for 60 seconds → paresthesias "
"(more sensitive than Tinel's)",
"<b>Reverse Phalen's / Prayer test:</b> Dorsa of hands pressed together (extension) → symptoms",
])
story += Warn("Sensation over the THENAR EMINENCE is SPARED in CTS because the palmar cutaneous "
"branch of the median nerve exits proximal to the carpal tunnel. A common MCQ trap.")
story += H2("High vs. Wrist Median Nerve — Key Differences")
med_data = [
["Feature", "High (Above Elbow)", "Wrist (CTS)"],
["Classic cause", "Supracondylar Fx humerus (child)", "Repetitive use / pregnancy / CTS"],
["Hand of benediction", "Yes (on attempted fist)", "No"],
["Thenar wasting", "Yes (with time)", "Yes (with time — LOAF)"],
["Index DIP flexion", "Lost (FDP-1,2 affected)", "Intact (FDP branches off early)"],
["Sensory — lateral 3.5 fingers", "Lost", "Lost"],
["Thenar eminence sensation", "Lost", "Spared (palmar cutaneous branch)"],
["Pronation", "Weak", "Normal"],
["Wrist flexion (FCR)", "Weak", "Normal (branches off proximal to tunnel)"],
]
story += table(med_data, col_widths=[46*mm, 58*mm, 58*mm])
# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 6 – ULNAR NERVE
# ═══════════════════════════════════════════════════════════════════════════════
story += H1("6. Ulnar Nerve Injuries")
story += H2("A. At the Elbow — Cubital Tunnel Syndrome")
story += bullets([
"<b>Most common cause of ulnar neuropathy</b>",
"Nerve passes through cubital tunnel behind medial epicondyle (between olecranon and medial epicondyle)",
"<b>Causes:</b> Medial epicondyle fracture, elbow valgus deformity (tardy ulnar palsy), "
"repetitive elbow flexion, leaning on elbows",
])
story += P("<b>Muscles lost:</b>")
story += bullets([
"FCU (ulnar wrist flexion)",
"FDP to ring + little fingers (DIP flexion lost — digit 4 and 5)",
"All interossei (finger abduction/adduction)",
"Hypothenar muscles (ADM, FDM, ODM)",
"Adductor pollicis + deep head FPB",
"Lumbricals 3 & 4 (ring + little finger MCP flexion)",
])
story += P("<b>Signs:</b>")
story += bullets([
"<b>Claw hand</b> of ring + little fingers (MCP hyperextension + IP flexion)",
"<b>Froment's sign:</b> Ask patient to hold paper between thumb and index; adductor pollicis "
"is weak, so patient compensates by flexing thumb IP (using FPL — median nerve). "
"Positive = thumb IP flexes during key pinch.",
"<b>Wartenberg's sign:</b> Little finger stays abducted during attempted adduction (EDQ unopposed "
"by paralysed 3rd volar interosseous)",
"Sensory loss: ulnar 1.5 fingers, medial palm, dorsum of ulnar hand",
"Hypothenar + interosseous wasting (guttering between metacarpals)",
])
story += H2("B. At the Wrist — Guyon's Canal")
story += bullets([
"<b>Classic scenario:</b> Cyclist (handlebar palsy), hook of hamate fracture, chronic hammering",
"FCU and FDP to ring/little are <b>SPARED</b> (these branches off above the wrist)",
"If only deep motor branch compressed: <b>motor deficit only, no sensory loss</b>",
"Interossei + hypothenar + adductor pollicis weak",
"Claw hand more pronounced than elbow-level injury (see Ulnar Paradox below)",
])
story += H2("The Ulnar Paradox — DIRECT FMGE MCQ")
story += P("<b>Question:</b> In which level of ulnar nerve injury is the claw hand deformity MORE pronounced?")
story += P("<b>Answer: Distal (wrist-level) injury produces a MORE pronounced claw than proximal (elbow-level) injury.</b>")
story += P("<b>Why?</b>")
story += bullets([
"<b>High ulnar lesion (elbow):</b> FDP to ring + little is ALSO paralysed. "
"Without FDP, the fingers cannot fully flex into the claw — IP joints cannot "
"pull down forcefully. Deformity is LESS obvious.",
"<b>Low ulnar lesion (wrist):</b> FDP to ring + little is INTACT. "
"Long flexors pull IP joints into strong flexion while lumbricals are still out → "
"MORE pronounced claw.",
])
story += Warn("The Ulnar Paradox: The more DISTAL the ulnar lesion, the MORE PRONOUNCED the "
"claw hand. This is counter-intuitive and a favourite FMGE trick question.")
story += H2("Elbow vs. Wrist Ulnar Nerve — Key Differences")
ul_data = [
["Feature", "Elbow (Cubital Tunnel)", "Wrist (Guyon's Canal)"],
["FCU", "Weak", "Normal"],
["FDP ring/little (DIP flex)", "Weak", "Normal"],
["Interossei + hypothenar", "Weak", "Weak"],
["Adductor pollicis", "Weak", "Weak"],
["Froment's sign", "Positive", "Positive"],
["Sensory loss", "Ulnar 1.5 fingers + medial palm + dorsum", "Variable; none if deep branch only"],
["Claw hand severity", "LESS pronounced (paradox)", "MORE pronounced (paradox)"],
["Classic cause", "Medial epicondyle Fx / elbow lean", "Cyclist / hamate Fx"],
]
story += table(ul_data, col_widths=[50*mm, 57*mm, 55*mm])
# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 7 – OTHER KEY NERVES
# ═══════════════════════════════════════════════════════════════════════════════
story += H1("7. Other High-Yield Nerves")
story += H2("A. Axillary Nerve")
story += bullets([
"<b>Origin:</b> Posterior cord (C5, C6)",
"<b>Course:</b> Winds around <b>surgical neck of humerus</b> with posterior circumflex humeral artery",
"<b>Classic injury:</b> Fracture of surgical neck of humerus OR anterior shoulder dislocation "
"(most common joint dislocation in the body)",
"<b>Muscles:</b> Deltoid + Teres minor",
"<b>Signs:</b> Loss of shoulder abduction (cannot abduct >15–20°), loss of external rotation",
"<b>Sensory:</b> 'Regimental badge area' — circular patch on lateral upper arm/shoulder",
])
story += Warn("C5 radiculopathy also weakens deltoid AND biceps. Axillary nerve injury spares "
"biceps (musculocutaneous territory). Use sensory distribution + biceps strength to differentiate.")
story += H2("B. Long Thoracic Nerve (C5, C6, C7)")
story += bullets([
"<b>Only muscle:</b> Serratus anterior",
"<b>Function:</b> Holds scapula against chest wall + protracts scapula + rotates glenoid "
"upward (allows arm elevation above 90°)",
"<b>Signs:</b> Winged scapula (medial border protrudes when pushing against wall); "
"arm cannot be raised past 90°",
"<b>Causes:</b> Mastectomy / axillary lymph node dissection, carrying heavy loads "
"('rucksack paralysis'), viral neuritis, stab wound to lateral chest",
])
story += Warn("Trapezius palsy (spinal accessory nerve CN XI) also causes winging — but winging "
"is worst when the arm is RAISED. Serratus anterior winging is worst when PUSHING. "
"Trapezius palsy also drops the shoulder.")
story += H2("C. Musculocutaneous Nerve")
story += bullets([
"<b>Origin:</b> Lateral cord (C5, C6, C7)",
"<b>Muscles:</b> Biceps brachii, brachialis, coracobrachialis",
"<b>Injury:</b> Lateral cord lesion, shoulder dislocation, axilla stab wound",
"<b>Signs:</b> Weak elbow flexion + weak forearm supination + absent biceps reflex",
"<b>Sensory:</b> Lateral forearm (becomes lateral cutaneous nerve of forearm)",
"<b>Distinguish from C5/C6 root:</b> Musculocutaneous lesion has lateral forearm sensory "
"loss; root lesion has broader dermatomal involvement",
])
# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 8 – HAND POSTURES
# ═══════════════════════════════════════════════════════════════════════════════
story += H1("8. Classic Hand Postures — Named Deformities")
posture_data = [
["Posture Name", "Nerve / Level", "When Seen", "Mechanism"],
["Waiter's Tip / Bellman's Tip", "Upper trunk C5-C6 (Erb's)", "At rest (passive)",
"Arm: adducted, int. rotated; elbow extended; wrist flexed"],
["Claw Hand (ring + little)", "Ulnar nerve (any level)", "At rest or on finger extension",
"MCP hyperextension + IP flexion; worse distally (ulnar paradox)"],
["Wrist Drop", "Radial nerve (spiral groove / axilla)", "At rest",
"Wrist + finger extensors paralysed; gravity causes wrist to fall"],
["Hand of Benediction / Preacher's Hand", "Proximal median nerve (above elbow)",
"When ATTEMPTING to make a fist",
"Index + middle stay extended (FDP-1,2 + FPL lost); ring + little flex normally"],
["Pope's Blessing / Oath Hand", "Proximal median nerve", "At rest",
"Index + middle extended at rest (same nerve, different context of description)"],
["Ape Hand / Simian Hand", "Chronic median + ulnar combined", "At rest (late stage)",
"Thenar + hypothenar wasting; thumb falls into plane of palm; no opposition"],
["OK Sign inability", "AIN (median branch)", "On attempted OK sign",
"FDP-1 + FPL weak; cannot form circle; makes a 'pinch' instead"],
]
story += table(posture_data, col_widths=[44*mm, 42*mm, 30*mm, 46*mm])
story += Warn("Claw hand vs. Hand of Benediction: Claw = at REST or on extension attempt "
"(ulnar). Benediction = when MAKING A FIST (proximal median). Examinees frequently "
"swap these two.")
# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 9 – PREGANGLIONIC vs POSTGANGLIONIC
# ═══════════════════════════════════════════════════════════════════════════════
story += H1("9. Preganglionic vs. Postganglionic Brachial Plexus Injury")
story += P("This distinction determines surgical outcome and is directly tested in FMGE.")
pg_data = [
["Feature", "Preganglionic (Root Avulsion)", "Postganglionic"],
["Site of injury", "Nerve root avulsed from spinal cord\n(proximal to DRG)", "Nerve torn distal to dorsal root ganglion"],
["Histamine test", "Axon flare PRESENT\n(DRG + axon to skin still intact)", "Axon flare ABSENT"],
["Horner's syndrome", "Present (if C8–T1 avulsion)", "Usually absent"],
["Paraspinal muscles (EMG)", "Denervated", "Normal"],
["SSEP / sensory NCS", "Preserved (DRG intact)", "Absent"],
["Cervical MRI/myelogram", "Pseudomeningocele", "Normal"],
["Phrenic nerve palsy", "Often co-exists (elevated hemidiaphragm)", "Usually absent"],
["Surgical repair", "NOT possible (no proximal stump); nerve transfer only", "Possible — nerve grafting / repair"],
["Prognosis", "Worse", "Better"],
]
story += table(pg_data, col_widths=[46*mm, 65*mm, 51*mm])
story += Tip("Preganglionic = root is torn from cord = no surgical repair possible. "
"Postganglionic = distal to DRG = repair/grafting feasible.")
# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 10 – ANATOMICAL SNUFFBOX
# ═══════════════════════════════════════════════════════════════════════════════
story += H1("10. Anatomical Snuffbox & Scaphoid Fracture")
story += H2("Anatomy of the Anatomical Snuffbox")
story += P("Triangular depression on the posterolateral side of the wrist and base of 1st "
"metacarpal, visible when the thumb is extended.")
snuff_data = [
["Border / Structure", "What forms it"],
["Lateral (radial) border", "Tendons of Abductor Pollicis Longus (APL) + Extensor Pollicis Brevis (EPB)"],
["Medial (ulnar) border", "Tendon of Extensor Pollicis Longus (EPL)"],
["Floor", "Scaphoid + Trapezium + distal ECRL + ECRB tendons"],
["Roof", "Skin"],
["Contents — Radial artery", "Passes obliquely through the floor, deep to tendons, adjacent to scaphoid"],
["Contents — Superficial radial nerve", "Passes subcutaneously over the roof"],
["Contents — Cephalic vein", "Origin from dorsal venous arch crosses over the roof"],
]
story += table(snuff_data, col_widths=[55*mm, 107*mm], hdr_rows=1)
story += H2("Clinical Significance — Scaphoid Fracture")
story += bullets([
"<b>Mechanism:</b> Fall on outstretched hand (FOOSH) — forced dorsiflexion",
"<b>Most common carpal bone fracture</b>",
"Up to <b>30–40% of scaphoid fractures are X-ray negative</b> on initial assessment",
"Anatomical snuffbox tenderness: sensitivity <b>87–100%</b>, specificity 3–98% "
"(very sensitive, not specific — use to rule OUT)",
"Combination (snuffbox tenderness + scaphoid tubercle tenderness + compression test "
"within 24 h): sensitivity <b>100%</b>, specificity <b>74%</b>",
])
story += Warn("A normal X-ray DOES NOT rule out a scaphoid fracture. Treat snuffbox "
"tenderness after FOOSH as scaphoid fracture until proven otherwise. "
"Immobilise in thumb spica splint; repeat X-ray at 10–14 days or proceed to CT/MRI.")
story += H2("Why Scaphoid Fractures Are Dangerous")
story += bullets([
"Blood supply enters the scaphoid <b>distally</b> (distal pole) via the radial artery",
"Proximal pole depends on <b>retrograde flow</b>",
"Waist fractures disrupt this supply → <b>avascular necrosis (AVN) of proximal pole</b> if missed",
"Proximal pole fractures have highest risk of AVN (~40%); waist fractures ~10–15%",
])
# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 11 – FRACTURE-TO-NERVE INJURY MAPPING
# ═══════════════════════════════════════════════════════════════════════════════
story += H1("11. Fracture-to-Nerve Injury Mapping (FMGE Favourite)")
fx_data = [
["Fracture / Dislocation", "Nerve at Risk", "Key Sign"],
["Surgical neck of humerus", "Axillary nerve", "Deltoid weakness + regimental badge sensory loss"],
["Mid-shaft (spiral groove) humerus", "Radial nerve", "Wrist drop (22% incidence)"],
["Supracondylar humerus (child)", "Median nerve / AIN", "Hand of benediction; can't make OK sign"],
["Lateral epicondyle humerus", "Radial nerve (PIN)", "Finger drop, no sensory loss"],
["Medial epicondyle / posterior elbow dislocation", "Ulnar nerve", "Claw (ring+little), Froment's sign"],
["Monteggia fracture (proximal ulna + radial head dislocation)", "PIN (radial nerve deep branch)", "Finger drop, no sensory loss"],
["Colles' fracture (distal radius)", "Median nerve / CTS", "Thenar wasting, carpal tunnel symptoms"],
["Hook of hamate fracture", "Ulnar nerve (Guyon's canal)", "Intrinsic weakness, variable sensory loss"],
["Anterior shoulder dislocation", "Axillary nerve", "Deltoid weakness + regimental badge area"],
["Glenohumeral dislocation (broad)", "Axillary nerve + brachial plexus (upper trunk)", "Combined — Erb's + axillary features"],
["1st rib / cervical rib (thoracic outlet)", "Lower trunk C8-T1", "Klumpke's signs ± Horner's"],
]
story += table(fx_data, col_widths=[58*mm, 48*mm, 56*mm])
# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 12 – MASTER QUICK-REFERENCE TABLE
# ═══════════════════════════════════════════════════════════════════════════════
story += H1("12. Master Quick-Reference — All Upper Limb Nerves")
master_data = [
["Nerve", "Level of Injury", "Mechanism", "Motor Loss", "Sensory Loss", "Named Sign"],
["Upper trunk C5–C6\n(Erb's palsy)", "Upper trunk", "Birth trauma / shoulder depression",
"Deltoid, biceps, supraspinatus, wrist ext", "Lateral arm + forearm", "Waiter's tip"],
["Lower trunk C8–T1\n(Klumpke's)", "Lower trunk", "Hyperabduction traction",
"Intrinsics, wrist/finger flexors", "Medial arm, ulnar hand", "Claw hand + Horner's"],
["Radial nerve", "Axilla (crutch palsy)", "Axillary crutch",
"Wrist + finger ext + TRICEPS", "Dorsolateral hand + post forearm", "Wrist drop + triceps absent"],
["Radial nerve", "Spiral groove", "Humeral shaft Fx / sleep compression",
"Wrist + finger ext (triceps SPARED)", "Dorsal lateral hand", "Wrist drop (Saturday night)"],
["PIN (radial)", "Radial tunnel", "Radial head Fx / Monteggia",
"Finger ext; ECRL spared → radial deviation", "NONE", "Finger drop without sensory loss"],
["Median nerve", "Above elbow", "Supracondylar Fx (child)",
"FDP-1,2; FPL; LOAF; pronation", "Lateral 3.5 fingers + lat palm", "Hand of benediction"],
["AIN (median)", "Forearm", "Entrapment / forearm trauma",
"FDP-1,2; FPL only", "NONE", "Can't make OK sign"],
["Median nerve", "Wrist (CTS)", "Repetitive use / pregnancy etc.",
"LOAF only", "Lateral 3.5 fingers (NOT thenar eminence)", "Tinel's + Phalen's; thenar wasting"],
["Ulnar nerve", "Elbow (cubital tunnel)", "Medial epicondyle Fx / leaning",
"FCU, FDP-4,5, intrinsics", "Ulnar 1.5 + med palm + dorsum", "Claw LESS pronounced; Froment's; Wartenberg's"],
["Ulnar nerve", "Wrist (Guyon's)", "Cyclist / hamate Fx",
"Intrinsics (FCU, FDP-4,5 spared)", "None if deep branch only", "Claw MORE pronounced (ulnar paradox)"],
["Axillary nerve", "Surgical neck humerus", "Surgical neck Fx / ant dislocation",
"Deltoid, teres minor", "Regimental badge area", "Shoulder abduction lost"],
["Long thoracic n.", "Variable", "Mastectomy / rucksack / viral",
"Serratus anterior", "None", "Winged scapula; arm can't go >90°"],
["Musculocutaneous n.", "Lateral cord / axilla", "Shoulder dislocation / stab",
"Biceps, brachialis", "Lateral forearm", "Weak elbow flexion + supination"],
]
story += table(master_data, col_widths=[30*mm, 22*mm, 30*mm, 40*mm, 28*mm, 32*mm])
# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 13 – FMGE ONE-LINERS
# ═══════════════════════════════════════════════════════════════════════════════
story += H1("13. FMGE High-Yield One-Liners")
one_liners = [
"Radial nerve = most commonly injured nerve in the upper limb overall (spiral groove vulnerability)",
"Median nerve = most commonly compressed nerve (CTS is the most common entrapment neuropathy)",
"Ulnar nerve = most commonly injured nerve AT THE ELBOW (cubital tunnel)",
"Supracondylar Fx humerus in children → median nerve / AIN injury (anterior fragment)",
"Posterior elbow dislocation → ulnar nerve injury",
"Anterior shoulder dislocation → axillary nerve injury (most common dislocation in the body)",
"Surgical neck humerus Fx → axillary nerve injury",
"Mid-shaft humeral Fx → radial nerve (22% incidence; most are neuropraxias)",
"Monteggia Fx → PIN injury (finger drop, NO sensory loss)",
"Colles' Fx → median nerve / acute CTS",
"Hook of hamate Fx → ulnar nerve at Guyon's canal",
"Winged scapula on wall push → long thoracic nerve (serratus anterior)",
"Winged scapula on arm elevation → spinal accessory nerve (trapezius)",
"Horner's + claw hand → preganglionic T1 root avulsion (Klumpke's level)",
"Horner's + apical lung mass → Pancoast tumour (lower plexus C8–T1 + T1 sympathetics)",
"Pseudomeningocele on MRI + Horner's → preganglionic root avulsion (no surgical repair possible)",
"Histamine test flare PRESENT despite anaesthetic skin → preganglionic injury (DRG intact)",
"Nerve regeneration rate = ~1 mm/day (3 cm/month); recovery takes months to over a year",
"Biceps function at 3 months = prognostic indicator in neonatal Erb's palsy",
"AIN test = OK sign; can't make circle = AIN palsy (no sensory loss)",
"Froment's sign = adductor pollicis palsy (ulnar); compensates with FPL (median)",
"Wartenberg's sign = 3rd volar interosseous palsy (ulnar); little finger stays abducted",
"Ulnar paradox: DISTAL lesion → MORE pronounced claw (FDP intact → stronger IP flexion)",
"CTS spares thenar eminence sensation (palmar cutaneous branch exits proximal to tunnel)",
"Scaphoid fracture: X-ray negative in 30–40% initially → treat snuffbox tenderness as Fx",
"Scaphoid blood supply enters DISTALLY → proximal pole at risk for AVN if waist Fx missed",
"APL + EPB = lateral border of anatomical snuffbox; EPL = medial border",
"Radial artery + superficial radial nerve + cephalic vein cross the anatomical snuffbox",
]
for i, line in enumerate(one_liners, 1):
story.append(Paragraph(f"<b>{i}.</b> {line}", S["bullet"]))
story += sp(2)
# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 14 – SCENARIO PATTERN RECOGNITION
# ═══════════════════════════════════════════════════════════════════════════════
story += H1("14. FMGE Scenario Pattern Recognition")
scenario_data = [
["Clinical Scenario", "Likely Injury", "Nerve / Level"],
["Newborn, shoulder dystocia, arm hangs internally rotated",
"Erb's palsy", "Upper trunk C5–C6"],
["Adult, motorcycle accident, arm hangs + wrist slightly flexed",
"Erb's palsy", "Upper trunk C5–C6"],
["Fall from tree grabbing branch → claw hand",
"Klumpke's palsy", "Lower trunk C8–T1"],
["Klumpke's features + drooping eyelid + small pupil",
"Klumpke's + Horner's", "Preganglionic T1 root avulsion"],
["Apical lung mass + claw hand + Horner's",
"Pancoast syndrome", "Lower trunk C8–T1 + T1 sympathetics"],
["Drunk patient, woke up with wrist drop, no fracture",
"Saturday night palsy", "Radial nerve, spiral groove"],
["Mid-shaft humerus fracture + wrist drop",
"Radial nerve injury", "Spiral groove (22% of mid-shaft Fx)"],
["Radial head fracture + finger drop, NO sensory loss",
"PIN injury", "Radial nerve deep branch, radial tunnel"],
["Child, supracondylar Fx + index/middle can't flex into fist",
"Median / AIN injury", "High median or AIN"],
["Can't make 'OK' sign, no sensory loss",
"AIN palsy", "Anterior interosseous nerve (median branch)"],
["Middle-aged woman, bilateral hand tingling at night, shakes hand for relief",
"Carpal tunnel syndrome", "Median nerve at wrist"],
["Medial epicondyle fracture → ring + little claw + Froment's sign",
"Ulnar nerve injury", "Cubital tunnel (elbow)"],
["Cyclist with weak intrinsics, NO sensory loss",
"Deep branch ulnar compression", "Guyon's canal (wrist)"],
["FOOSH + snuffbox tenderness, normal X-ray",
"Occult scaphoid fracture", "Treat as fracture; immobilise"],
["Surgical neck humerus Fx + deltoid weakness + regimental badge numbness",
"Axillary nerve injury", "Surgical neck level"],
["Mastectomy + arm can't raise past 90° + winged scapula",
"Long thoracic nerve injury", "Serratus anterior palsy"],
["Factory worker, Monteggia fracture + finger drop (no sensory loss)",
"PIN injury", "Radial nerve deep branch"],
["MRI shows pseudomeningocele at C8–T1 + Horner's + no surgical target",
"Preganglionic root avulsion", "C8–T1 avulsion; nerve transfer only option"],
]
story += table(scenario_data, col_widths=[68*mm, 48*mm, 46*mm])
# ── Footer note ───────────────────────────────────────────────────────────────
story += sp(4)
story += hr()
story.append(Paragraph(
"<b>Sources:</b> Gray's Anatomy for Students | Miller's Review of Orthopaedics 9e | "
"Neuroanatomy through Clinical Cases 3e | Localization in Clinical Neurology 8e | "
"Schwartz's Principles of Surgery 11e | Bailey & Love 28e | "
"THIEME Atlas of General Anatomy & Musculoskeletal System | "
"Rockwood & Green's Fractures in Adults 10e (2025) | Rosen's Emergency Medicine",
S["footer"]
))
# ── Build ─────────────────────────────────────────────────────────────────────
doc.build(story)
print(f"PDF written to: {OUTPUT}")
cd /home/daytona/workspace/brachial-plexus-pdf && python3 generate_pdf.py 2>&1
ls -lh /home/daytona/workspace/brachial-plexus-pdf/
Brachial Plexus Upper Limb Nerve Injuries FMGE
PDF Document · PDF
Is this both files combined together 1st and second?