Make a exam oriented notes for neuro -ophthalmology covering latest rguhs questions In pdf format
RGUHS ophthalmology exam questions neuro-ophthalmology recent years
https://www.eophtha.com/images/uploads/MS.pdf
mkdir -p /home/daytona/workspace/neuro-ophthalmology && echo "Directory ready"
~/neuro-ophthalmology/generate_notes.py
#!/usr/bin/env python3
"""Generate RGUHS Neuro-Ophthalmology Exam Notes PDF"""
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.lib.colors import HexColor, white, black, Color
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
PageBreak, HRFlowable, KeepTogether
)
from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_JUSTIFY
from reportlab.platypus.flowables import BalancedColumns
OUTPUT_PATH = "/home/daytona/workspace/neuro-ophthalmology/RGUHS_Neuro_Ophthalmology_Notes.pdf"
# Color palette - professional medical exam notes
DARK_BLUE = HexColor("#1A237E")
MED_BLUE = HexColor("#1565C0")
LIGHT_BLUE = HexColor("#E3F2FD")
TEAL = HexColor("#00695C")
LIGHT_TEAL = HexColor("#E0F2F1")
RED = HexColor("#B71C1C")
LIGHT_RED = HexColor("#FFEBEE")
ORANGE = HexColor("#E65100")
LIGHT_ORANGE = HexColor("#FFF3E0")
PURPLE = HexColor("#4A148C")
LIGHT_PURPLE = HexColor("#F3E5F5")
GRAY_BG = HexColor("#F5F5F5")
DARK_GRAY = HexColor("#212121")
MED_GRAY = HexColor("#616161")
YELLOW_HL = HexColor("#FFF9C4")
GREEN = HexColor("#1B5E20")
LIGHT_GREEN = HexColor("#E8F5E9")
W, H = A4
def make_doc():
doc = SimpleDocTemplate(
OUTPUT_PATH,
pagesize=A4,
leftMargin=1.8*cm, rightMargin=1.8*cm,
topMargin=2*cm, bottomMargin=2*cm,
title="RGUHS Neuro-Ophthalmology Exam Notes",
author="Orris Medical Education"
)
return doc
def make_styles():
styles = getSampleStyleSheet()
cover_title = ParagraphStyle("CoverTitle",
parent=styles["Title"],
fontSize=28, fontName="Helvetica-Bold",
textColor=white, alignment=TA_CENTER,
spaceAfter=8)
cover_sub = ParagraphStyle("CoverSub",
parent=styles["Normal"],
fontSize=14, fontName="Helvetica",
textColor=HexColor("#BBDEFB"), alignment=TA_CENTER,
spaceAfter=4)
chapter_h = ParagraphStyle("ChapterH",
parent=styles["Heading1"],
fontSize=16, fontName="Helvetica-Bold",
textColor=white, alignment=TA_LEFT,
spaceBefore=14, spaceAfter=6,
leftIndent=10, rightIndent=10,
borderPad=5)
section_h = ParagraphStyle("SectionH",
parent=styles["Heading2"],
fontSize=12, fontName="Helvetica-Bold",
textColor=DARK_BLUE, alignment=TA_LEFT,
spaceBefore=10, spaceAfter=4,
borderColor=MED_BLUE, borderWidth=0,
leftIndent=0)
subsec_h = ParagraphStyle("SubsecH",
parent=styles["Heading3"],
fontSize=11, fontName="Helvetica-Bold",
textColor=TEAL, alignment=TA_LEFT,
spaceBefore=8, spaceAfter=3)
body = ParagraphStyle("Body",
parent=styles["Normal"],
fontSize=9.5, fontName="Helvetica",
textColor=DARK_GRAY, alignment=TA_JUSTIFY,
spaceAfter=4, leading=14)
bullet = ParagraphStyle("Bullet",
parent=styles["Normal"],
fontSize=9.5, fontName="Helvetica",
textColor=DARK_GRAY, alignment=TA_LEFT,
spaceAfter=2, leading=13,
leftIndent=14, firstLineIndent=-10)
sub_bullet = ParagraphStyle("SubBullet",
parent=styles["Normal"],
fontSize=9, fontName="Helvetica",
textColor=MED_GRAY, alignment=TA_LEFT,
spaceAfter=2, leading=12,
leftIndent=26, firstLineIndent=-10)
exam_q = ParagraphStyle("ExamQ",
parent=styles["Normal"],
fontSize=9.5, fontName="Helvetica-Bold",
textColor=RED, alignment=TA_LEFT,
spaceAfter=2, leading=13,
leftIndent=14, firstLineIndent=-10)
tip = ParagraphStyle("Tip",
parent=styles["Normal"],
fontSize=9, fontName="Helvetica-Oblique",
textColor=GREEN, alignment=TA_LEFT,
spaceAfter=2, leading=12,
leftIndent=14, firstLineIndent=-10)
bold_label = ParagraphStyle("BoldLabel",
parent=styles["Normal"],
fontSize=9.5, fontName="Helvetica-Bold",
textColor=DARK_GRAY, alignment=TA_LEFT,
spaceAfter=2, leading=13)
toc_style = ParagraphStyle("TocStyle",
parent=styles["Normal"],
fontSize=10, fontName="Helvetica",
textColor=DARK_BLUE, alignment=TA_LEFT,
spaceAfter=3, leading=14,
leftIndent=14)
return {
"cover_title": cover_title, "cover_sub": cover_sub,
"chapter_h": chapter_h, "section_h": section_h,
"subsec_h": subsec_h, "body": body, "bullet": bullet,
"sub_bullet": sub_bullet, "exam_q": exam_q,
"tip": tip, "bold_label": bold_label, "toc_style": toc_style,
"styles": styles
}
def chapter_header(title, color, s):
"""Full-width colored chapter header bar."""
data = [[Paragraph(title, s["chapter_h"])]]
t = Table(data, colWidths=[W - 3.6*cm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), color),
("TOPPADDING", (0,0), (-1,-1), 8),
("BOTTOMPADDING", (0,0), (-1,-1), 8),
("LEFTPADDING", (0,0), (-1,-1), 12),
("RIGHTPADDING", (0,0), (-1,-1), 12),
("ROUNDEDCORNERS", [5,5,5,5]),
]))
return t
def info_box(title, items, bg_color, border_color, s, bullet_char="•"):
"""A colored info/summary box with a title and bullet items."""
content = []
content.append(Paragraph(f"<b>{title}</b>", ParagraphStyle("BoxTitle",
parent=s["styles"]["Normal"],
fontSize=10, fontName="Helvetica-Bold",
textColor=border_color, alignment=TA_LEFT,
spaceAfter=3)))
for item in items:
content.append(Paragraph(f"{bullet_char} {item}",
ParagraphStyle("BoxItem",
parent=s["styles"]["Normal"],
fontSize=9, fontName="Helvetica",
textColor=DARK_GRAY, spaceAfter=2, leading=12,
leftIndent=12, firstLineIndent=-10)))
data = [[content]]
t = Table(data, colWidths=[W - 3.6*cm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg_color),
("BOX", (0,0), (-1,-1), 1.5, border_color),
("TOPPADDING", (0,0), (-1,-1), 8),
("BOTTOMPADDING", (0,0), (-1,-1), 8),
("LEFTPADDING", (0,0), (-1,-1), 12),
("RIGHTPADDING", (0,0), (-1,-1), 10),
("ROUNDEDCORNERS", [4,4,4,4]),
]))
return t
def two_col_table(left_items, right_items, headers, bg, border, s):
"""Two-column comparison table."""
col_w = (W - 3.6*cm) / 2
def cell(items, title, color):
elems = [Paragraph(f"<b>{title}</b>", ParagraphStyle("TH",
parent=s["styles"]["Normal"], fontSize=9.5, fontName="Helvetica-Bold",
textColor=white, spaceAfter=4))]
for i in items:
elems.append(Paragraph(f"• {i}", ParagraphStyle("TC",
parent=s["styles"]["Normal"], fontSize=9, fontName="Helvetica",
textColor=DARK_GRAY, spaceAfter=2, leading=12,
leftIndent=10, firstLineIndent=-8)))
return elems
data = [
[Paragraph(f"<b>{headers[0]}</b>", ParagraphStyle("H0", parent=s["styles"]["Normal"],
fontSize=9.5, fontName="Helvetica-Bold", textColor=white)),
Paragraph(f"<b>{headers[1]}</b>", ParagraphStyle("H1", parent=s["styles"]["Normal"],
fontSize=9.5, fontName="Helvetica-Bold", textColor=white))],
]
max_r = max(len(left_items), len(right_items))
for i in range(max_r):
l = Paragraph(f"• {left_items[i]}", ParagraphStyle("B", parent=s["styles"]["Normal"],
fontSize=9, fontName="Helvetica", textColor=DARK_GRAY, leading=12,
leftIndent=8, firstLineIndent=-6)) if i < len(left_items) else Paragraph("", s["body"])
r = Paragraph(f"• {right_items[i]}", ParagraphStyle("B", parent=s["styles"]["Normal"],
fontSize=9, fontName="Helvetica", textColor=DARK_GRAY, leading=12,
leftIndent=8, firstLineIndent=-6)) if i < len(right_items) else Paragraph("", s["body"])
data.append([l, r])
t = Table(data, colWidths=[col_w, col_w])
style = TableStyle([
("BACKGROUND", (0,0), (1,0), border),
("BACKGROUND", (0,1), (-1,-1), bg),
("BOX", (0,0), (-1,-1), 1, border),
("INNERGRID", (0,0), (-1,-1), 0.5, border),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
("VALIGN", (0,0), (-1,-1), "TOP"),
])
t.setStyle(style)
return t
def rguhs_box(questions, s):
"""Red box for RGUHS exam questions."""
content = [Paragraph("🎯 RGUHS EXAM QUESTIONS", ParagraphStyle("RTitle",
parent=s["styles"]["Normal"],
fontSize=10, fontName="Helvetica-Bold",
textColor=RED, spaceAfter=5))]
for q in questions:
content.append(Paragraph(f"✦ {q}", ParagraphStyle("RQ",
parent=s["styles"]["Normal"],
fontSize=9, fontName="Helvetica",
textColor=DARK_GRAY, spaceAfter=3, leading=13,
leftIndent=14, firstLineIndent=-12)))
data = [[content]]
t = Table(data, colWidths=[W - 3.6*cm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), LIGHT_RED),
("BOX", (0,0), (-1,-1), 1.5, RED),
("TOPPADDING", (0,0), (-1,-1), 8),
("BOTTOMPADDING", (0,0), (-1,-1), 8),
("LEFTPADDING", (0,0), (-1,-1), 12),
("RIGHTPADDING", (0,0), (-1,-1), 10),
("ROUNDEDCORNERS", [4,4,4,4]),
]))
return t
def mnemonic_box(title, mnemonic, explanation, s):
content = [
Paragraph(f"🧠 {title}", ParagraphStyle("MTitle",
parent=s["styles"]["Normal"],
fontSize=10, fontName="Helvetica-Bold",
textColor=PURPLE, spaceAfter=5)),
Paragraph(f"<b>{mnemonic}</b>", ParagraphStyle("Mnemo",
parent=s["styles"]["Normal"],
fontSize=11, fontName="Helvetica-Bold",
textColor=DARK_BLUE, spaceAfter=4)),
]
for line in explanation:
content.append(Paragraph(f"<b>{line[0]}</b> — {line[1]}" if len(line) == 2 else line[0],
ParagraphStyle("ME", parent=s["styles"]["Normal"],
fontSize=9, fontName="Helvetica",
textColor=DARK_GRAY, spaceAfter=2, leading=12,
leftIndent=14)))
data = [[content]]
t = Table(data, colWidths=[W - 3.6*cm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), LIGHT_PURPLE),
("BOX", (0,0), (-1,-1), 1.5, PURPLE),
("TOPPADDING", (0,0), (-1,-1), 8),
("BOTTOMPADDING", (0,0), (-1,-1), 8),
("LEFTPADDING", (0,0), (-1,-1), 12),
("RIGHTPADDING", (0,0), (-1,-1), 10),
("ROUNDEDCORNERS", [4,4,4,4]),
]))
return t
def gen_table(headers, rows, col_widths, border_color, header_color, s):
"""Generic multi-column table."""
header_row = [Paragraph(f"<b>{h}</b>", ParagraphStyle("GH",
parent=s["styles"]["Normal"],
fontSize=9, fontName="Helvetica-Bold",
textColor=white)) for h in headers]
data = [header_row]
for row in rows:
data.append([Paragraph(str(c), ParagraphStyle("GC",
parent=s["styles"]["Normal"],
fontSize=8.5, fontName="Helvetica",
textColor=DARK_GRAY, leading=12)) for c in row])
t = Table(data, colWidths=col_widths)
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), header_color),
("BACKGROUND", (0,1), (-1,-1), GRAY_BG),
("ROWBACKGROUNDS", (0,1), (-1,-1), [white, GRAY_BG]),
("BOX", (0,0), (-1,-1), 1, border_color),
("INNERGRID", (0,0), (-1,-1), 0.5, border_color),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
return t
# ─────────────────────────────────────────────
# Build document story
# ─────────────────────────────────────────────
def build_story(s):
story = []
B = s["body"]
BL = s["bullet"]
SBL = s["sub_bullet"]
SH = s["section_h"]
SSH = s["subsec_h"]
sp = lambda n=6: Spacer(1, n)
hr = lambda: HRFlowable(width="100%", thickness=0.5, color=HexColor("#BDBDBD"), spaceAfter=4, spaceBefore=4)
# ══════════════════════════════════════
# COVER PAGE
# ══════════════════════════════════════
cover_bg_data = [[
Paragraph("NEURO-OPHTHALMOLOGY", s["cover_title"]),
]]
cover_table = Table([[
Paragraph("NEURO-OPHTHALMOLOGY", ParagraphStyle("CT", parent=s["styles"]["Normal"],
fontSize=26, fontName="Helvetica-Bold", textColor=white, alignment=TA_CENTER)),
]], colWidths=[W - 3.6*cm])
cover_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), DARK_BLUE),
("TOPPADDING", (0,0), (-1,-1), 22),
("BOTTOMPADDING", (0,0), (-1,-1), 22),
("LEFTPADDING", (0,0), (-1,-1), 16),
("ROUNDEDCORNERS", [8,8,8,8]),
]))
story.append(sp(30))
story.append(cover_table)
story.append(sp(10))
sub_data = [
[Paragraph("EXAM-ORIENTED NOTES", ParagraphStyle("CS",
parent=s["styles"]["Normal"],
fontSize=15, fontName="Helvetica-Bold", textColor=MED_BLUE, alignment=TA_CENTER))],
[Paragraph("RGUHS MS Ophthalmology | Paper IV", ParagraphStyle("CS2",
parent=s["styles"]["Normal"],
fontSize=11, fontName="Helvetica", textColor=MED_GRAY, alignment=TA_CENTER))],
[Paragraph("Based on Kanski's Clinical Ophthalmology 10th Ed.", ParagraphStyle("CS3",
parent=s["styles"]["Normal"],
fontSize=10, fontName="Helvetica-Oblique", textColor=MED_GRAY, alignment=TA_CENTER))],
]
for row in sub_data:
story.append(row[0])
story.append(sp(4))
story.append(sp(16))
hr_data = [[""]]
hr_t = Table(hr_data, colWidths=[W-3.6*cm])
hr_t.setStyle(TableStyle([("LINEBELOW", (0,0), (-1,-1), 2, MED_BLUE)]))
story.append(hr_t)
story.append(sp(12))
toc_items = [
("1", "Optic Nerve & Optic Neuropathies", "Optic neuritis, AION, PION, Leber's, Nutritional, Papilloedema, IIH"),
("2", "Optic Atrophy", "Primary, Secondary, Consecutive, Causes, Signs"),
("3", "Visual Pathway Defects", "Chiasmal lesions, Retrochiasmal, Occipital cortex"),
("4", "3rd Cranial Nerve Palsy", "Anatomy, Signs, Causes, Pupil-sparing, Aberrant regeneration"),
("5", "4th Cranial Nerve Palsy", "Trochlear nerve, Superior oblique, Signs, Causes"),
("6", "6th Cranial Nerve Palsy", "Abducens, Gradenigo syndrome, False localizing sign"),
("7", "Pupillary Abnormalities", "Horner syndrome, Adie pupil, RAPD, Argyll Robertson, Marcus Gunn"),
("8", "Myasthenia Gravis", "Ocular features, Diagnosis, Treatment - Complete RGUHS Topic"),
("9", "Nystagmus", "Types, Classification, Clinical significance"),
("10", "Pituitary Tumors", "Adenoma, Apoplexy, Craniopharyngioma - Ocular manifestations"),
("11", "Pseudotumour Cerebri (IIH)", "Diagnosis, Treatment, Visual prognosis"),
("12", "Traumatic Optic Neuropathy", "Management, Steroid use, Surgery"),
("13", "Giant Cell Arteritis", "Features, AAION, Emergency management"),
("14", "Leber Hereditary Optic Neuropathy", "Genetics, Presentation, Treatment"),
]
toc_label = ParagraphStyle("TocLabel", parent=s["styles"]["Normal"],
fontSize=11, fontName="Helvetica-Bold", textColor=DARK_BLUE, spaceAfter=10, alignment=TA_CENTER)
story.append(Paragraph("CONTENTS", toc_label))
story.append(sp(6))
toc_rows = []
for num, title, sub in toc_items:
toc_rows.append([
Paragraph(f"<b>{num}</b>", ParagraphStyle("TN",
parent=s["styles"]["Normal"], fontSize=9.5, fontName="Helvetica-Bold",
textColor=white, alignment=TA_CENTER)),
Paragraph(f"<b>{title}</b><br/><font size='8' color='#9E9E9E'>{sub}</font>",
ParagraphStyle("TT", parent=s["styles"]["Normal"],
fontSize=9.5, fontName="Helvetica", textColor=DARK_GRAY))
])
toc_t = Table(toc_rows, colWidths=[1.2*cm, W-5.0*cm])
toc_t.setStyle(TableStyle([
("BACKGROUND", (0,0), (0,-1), MED_BLUE),
("BACKGROUND", (1,0), (1,-1), white),
("ROWBACKGROUNDS", (1,0), (1,-1), [white, LIGHT_BLUE]),
("BOX", (0,0), (-1,-1), 1, MED_BLUE),
("INNERGRID", (0,0), (-1,-1), 0.5, HexColor("#90CAF9")),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 8),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("ALIGN", (0,0), (0,-1), "CENTER"),
]))
story.append(toc_t)
story.append(PageBreak())
# ══════════════════════════════════════
# CHAPTER 1: OPTIC NERVE & OPTIC NEUROPATHIES
# ══════════════════════════════════════
story.append(chapter_header("CHAPTER 1: OPTIC NERVE & OPTIC NEUROPATHIES", DARK_BLUE, s))
story.append(sp(8))
story.append(Paragraph("1.1 Anatomy of the Optic Nerve", SH))
story.append(Paragraph(
"The optic nerve has four segments: <b>intraocular (1 mm)</b>, "
"<b>intraorbital (25 mm)</b>, <b>intracanalicular (4–9 mm)</b>, and <b>intracranial (10 mm)</b>. "
"It is surrounded by meningeal sheaths (dura, arachnoid, pia) and the subarachnoid space communicates "
"with the intracranial subarachnoid space — hence raised ICP causes papilloedema.",
B))
story.append(sp(4))
story.append(info_box("Blood Supply of Optic Nerve Head (Common RGUHS Long Essay)", [
"Prelaminar region: Short posterior ciliary arteries (via circle of Zinn–Haller)",
"Laminar region: Short posterior ciliary arteries (direct branches)",
"Retrolaminar region: Centrifugal branches of central retinal artery + recurrent pial branches",
"Optic nerve proper: Pial plexus (from ophthalmic artery and its branches)",
"Central retinal artery enters the nerve ~1 cm behind the globe",
"Clinical: AION results from ischaemia of short posterior ciliary arteries",
], LIGHT_BLUE, MED_BLUE, s))
story.append(sp(6))
# Visual Evoked Potentials
story.append(Paragraph("1.2 Visual Evoked Potentials (VEP)", SH))
story.append(Paragraph(
"VEP measures electrical activity in the visual cortex. The <b>P100 wave</b> (positive peak at ~100 ms) "
"is the most clinically relevant. Prolonged P100 latency indicates demyelination (MS/optic neuritis). "
"Reduced amplitude indicates axonal loss.", B))
story.append(sp(4))
story.append(gen_table(
["Parameter", "Normal", "Optic Neuritis / MS", "AION"],
[
["P100 Latency", "~100 ms", "Prolonged (>115 ms)", "Normal or mildly prolonged"],
["Amplitude", "Normal", "Reduced or absent acutely", "Reduced"],
["Recovery", "—", "Latency remains prolonged even after recovery", "Permanent reduction"],
["Interocular diff.", "<6 ms", "Significant asymmetry", "Asymmetry present"],
],
[3*cm, 3.5*cm, 5*cm, 4.5*cm], MED_BLUE, MED_BLUE, s
))
story.append(sp(8))
# Optic Neuritis
story.append(Paragraph("1.3 Demyelinating Optic Neuritis", SH))
story.append(Paragraph(
"Optic neuritis is inflammation of the optic nerve, most commonly due to demyelination. "
"It is the most common cause of acute monocular visual loss in young adults (F>M, 2nd–4th decade).", B))
story.append(sp(4))
story.append(gen_table(
["Feature", "Details"],
[
["Onset", "Subacute, over hours to days"],
["Pain", "Retroorbital / periorbital pain (92%), worse on eye movement — KEY feature"],
["Visual loss", "Variable; worst within 1–2 weeks"],
["Visual field defect", "Central scotoma (most common), centrocaecal, nerve fibre bundle, altitudinal"],
["RAPD", "Present (afferent pupil defect)"],
["Fundus", "Usually normal (retrobulbar neuritis 2/3 cases); disc swelling in papillitis 1/3"],
["Colour vision", "Red desaturation; defective colour vision disproportionate to VA loss"],
["Recovery", ">90% recover VA to 6/9 or better; most improve within 4 weeks"],
["MS risk", "~50% develop MS within 15 yrs; MRI lesions increase risk to 72%"],
],
[4*cm, 12*cm], MED_BLUE, MED_BLUE, s
))
story.append(sp(6))
story.append(info_box("Steroid Treatment in Optic Neuritis (Optic Neuritis Treatment Trial - ONTT)", [
"IV methylprednisolone 1g/day × 3 days → oral prednisolone 1mg/kg × 11 days → taper 3 days",
"SPEEDS recovery by 2–3 weeks; does NOT improve final visual outcome",
"DELAYS onset of clinical MS in short term",
"Oral prednisolone alone: INCREASES risk of recurrence — avoid without prior IV steroids",
"Indication: VA worse than 6/12 within first week, or poor vision in fellow eye",
], LIGHT_TEAL, TEAL, s))
story.append(sp(6))
story.append(rguhs_box([
"Discuss the pathogenesis, clinical features, diagnosis and management of optic neuritis [Long Essay — 20 marks]",
"Optic neuritis and its relationship to multiple sclerosis [Short Essay — 10 marks]",
"Visual evoked potentials in optic neuritis [Short Essay]",
], s))
story.append(sp(8))
# AION
story.append(Paragraph("1.4 Anterior Ischaemic Optic Neuropathy (AION)", SH))
story.append(two_col_table(
["Age > 50 years", "Vasculopathic risk factors (DM, HTN, hyperlipidaemia)", "No pain",
"Altitudinal field defect (inferior more common)", "Disc swelling (pale, sectoral)",
"Small cup-to-disc ratio ('disc at risk')", "Fellow eye affected in ~40%",
"Management: Control risk factors; aspirin"],
["Age > 70 years", "Giant Cell Arteritis (ESR/CRP elevated)", "Jaw claudication, scalp tenderness, headache",
"Profound visual loss, may be sudden", "Pale disc swelling", "Contralateral eye at risk immediately",
"EMERGENCY: High-dose IV steroids immediately (1g methylprednisolone) before biopsy",
"Temporal artery biopsy confirmatory (skip lesions)"],
["Non-Arteritic AION (NAION)", "Arteritic AION (AAION)"],
LIGHT_BLUE, MED_BLUE, s
))
story.append(sp(6))
story.append(rguhs_box([
"Describe the clinical features and management of giant cell arteritis [Long Essay — 20 marks]",
"Anterior ischaemic optic neuropathy — differentiate arteritic from non-arteritic [Short Essay]",
"Traumatic optic neuropathy [Short Essay — 10 marks]",
], s))
story.append(sp(8))
# Traumatic Optic Neuropathy
story.append(Paragraph("1.5 Traumatic Optic Neuropathy (TON)", SH))
story.append(gen_table(
["Aspect", "Details"],
[
["Mechanism", "Direct (penetrating) or indirect (blunt trauma → shockwave through bony canal)"],
["Site", "Intracanalicular part most vulnerable (fixed dural attachments)"],
["Features", "RAPD, visual loss, normal disc initially → late optic atrophy"],
["Investigations", "CT orbit/head (orbital fracture, intracanalicular injury), VEP"],
["Medical Rx", "High-dose IV methylprednisolone (NASCIS protocol) — controversial, not proven"],
["Surgical Rx", "Optic canal decompression if bony fragment/haematoma compressing nerve"],
["Prognosis", "Variable; spontaneous recovery in 40–60%"],
],
[4*cm, 12*cm], TEAL, TEAL, s
))
story.append(sp(8))
story.append(PageBreak())
# ══════════════════════════════════════
# CHAPTER 2: OPTIC ATROPHY
# ══════════════════════════════════════
story.append(chapter_header("CHAPTER 2: OPTIC ATROPHY", MED_BLUE, s))
story.append(sp(8))
story.append(Paragraph("Definition", SH))
story.append(Paragraph(
"Optic atrophy is degeneration of the optic nerve fibres with replacement by glial tissue, resulting in "
"a pale optic disc. It is not a diagnosis but a sign of underlying pathology.", B))
story.append(sp(4))
story.append(gen_table(
["Type", "Disc Appearance", "Causes"],
[
["Primary (simple)", "Flat, dead white disc; sharp margins; vessels normal; lamina cribrosa visible",
"Optic neuritis, compression, trauma, Leber's, hereditary, toxic/nutritional"],
["Secondary", "Slightly raised, grey/dirty white; blurred margins; gliosis; fewer vessels; lamina not visible",
"Longstanding papilloedema or papillitis"],
["Consecutive (ascending)", "Pallor with disc cupping; sometimes sheathing of vessels",
"Diffuse retinal disease (e.g. extensive photocoagulation, CRAO, pigmentary retinopathy)"],
["Glaucomatous", "Deep cup; pallor; cup:disc ratio increased; vessel baring; bayonetting",
"Advanced glaucoma"],
],
[3.5*cm, 5.5*cm, 7*cm], MED_BLUE, MED_BLUE, s
))
story.append(sp(6))
story.append(info_box("Temporal Pallor vs. Diffuse Pallor", [
"Temporal pallor → papillomacular bundle affected → demyelinating optic neuritis (MS)",
"Band atrophy (nasal + temporal pallor) → chiasmal/optic tract lesion",
"Diffuse pallor → widespread fibre loss (AION, compression, glaucoma)",
"Bow-tie / band atrophy → bitemporal fibres at chiasm; seen in optic tract lesions",
], LIGHT_ORANGE, ORANGE, s))
story.append(sp(6))
story.append(rguhs_box([
"Optic atrophy — classification, causes and clinical features [Short Essay — 10 marks]",
"Leber hereditary optic neuropathy [Short Essay — 10 marks]",
"Pseudo papilloedema [Short Essay]",
], s))
story.append(sp(6))
# Leber's
story.append(Paragraph("2.1 Leber Hereditary Optic Neuropathy (LHON)", SH))
story.append(gen_table(
["Feature", "Details"],
[
["Inheritance", "Mitochondrial DNA mutations (ND4 gene 11778 — most common, 50%; ND1 3460; ND6 14484)"],
["Sex", "Males predominantly affected; females are carriers (penetrance higher in males)"],
["Age", "Young adults, typically 15–35 years"],
["Presentation", "Painless, acute/subacute central visual loss; one eye then other (weeks to months)"],
["Fundus (acute)", "Peripapillary telangiectatic microangiopathy; disc pseudooedema; tortuous vessels"],
["Fundus (chronic)", "Optic atrophy — temporal pallor initially then diffuse"],
["VF defect", "Central or centrocaecal scotoma"],
["Prognosis", "Most cases: permanent severe visual loss; 14484 mutation has best recovery"],
["Treatment", "Idebenone (antioxidant; evidence for 11778 mutation); gene therapy trials ongoing"],
["RGUHS Note", "Mitochondrial inheritance: all children of affected mother at risk; father cannot transmit"],
],
[4*cm, 12*cm], TEAL, TEAL, s
))
story.append(sp(6))
story.append(mnemonic_box(
"LHON Mutations Mnemonic",
"11778 (ND4) — 3460 (ND1) — 14484 (ND6)",
[
["11778", "Most common (50%); worst prognosis"],
["3460", "Second; intermediate prognosis"],
["14484", "Third; BEST prognosis for recovery"],
], s
))
story.append(sp(8))
story.append(PageBreak())
# ══════════════════════════════════════
# CHAPTER 3: VISUAL PATHWAY DEFECTS
# ══════════════════════════════════════
story.append(chapter_header("CHAPTER 3: VISUAL PATHWAY DEFECTS & CHIASM", TEAL, s))
story.append(sp(8))
story.append(Paragraph("3.1 Visual Field Defects — Anatomical Localisation", SH))
story.append(gen_table(
["Site of Lesion", "Visual Field Defect", "Key Causes"],
[
["Optic nerve", "Monocular loss; central scotoma; altitudinal defect",
"Optic neuritis, AION, glaucoma, compression"],
["Optic chiasm (central)", "Bitemporal hemianopia", "Pituitary adenoma (grows from below)"],
["Chiasm — anterior", "Junctional scotoma (ipsilateral central + contralateral superior temporal)",
"Pituitary adenoma + postfixed chiasm; anterior communicating artery aneurysm"],
["Chiasm — superior", "Bitemporal inferior quadrantanopia initially",
"Craniopharyngioma (grows from above); suprasellar meningioma"],
["Optic tract", "Incongruous homonymous hemianopia + contralateral RAPD",
"Craniopharyngioma, pituitary lesions, MS"],
["LGN (lateral geniculate)", "Incongruous homonymous hemianopia",
"Rare; vascular"],
["Optic radiation (parietal)", "Inferior homonymous quadrantanopia (\"pie in the floor\")",
"Parietal lobe tumour/stroke"],
["Optic radiation (temporal)", "Superior homonymous quadrantanopia (\"pie in the sky\"); Meyer's loop",
"Temporal lobe surgery, tumour"],
["Occipital cortex", "Congruous homonymous hemianopia with macular sparing",
"PCA infarction; occipital tumour"],
["Bilateral occipital", "Cortical blindness; normal fundus + normal pupils",
"Bilateral PCA infarction (basilar artery thrombosis)"],
],
[4.5*cm, 5.5*cm, 6*cm], TEAL, TEAL, s
))
story.append(sp(6))
story.append(mnemonic_box(
"Macular Sparing — Why?",
"Dual blood supply to macular area in occipital cortex",
[
["Occipital pole", "Supplied by both MCA and PCA — macular representation escapes PCA infarction"],
["Clinical use", "Macular sparing hemianopia → occipital cortex (cortical)"],
["Macula splitting", "Temporal lobe lesion or optic tract lesion"],
], s
))
story.append(sp(6))
story.append(Paragraph("3.2 Chiasmal Lesions — Pituitary Tumors", SH))
story.append(gen_table(
["Tumor Type", "Hormonal Features", "Visual Features", "Treatment"],
[
["GH-secreting (Acromegaly)", "Acromegaly; gigantism in children; IGF-1 elevated",
"Bitemporal hemianopia when macroadenoma",
"Surgery (trans-sphenoidal) ± Octreotide ± Radiotherapy"],
["Prolactinoma", "Galactorrhoea, amenorrhoea, infertility",
"Bitemporal hemianopia in large tumours",
"Medical: Cabergoline/Bromocriptine (first line)"],
["ACTH-secreting (Cushing)", "Cushing disease; moon face, striae, HTN",
"Bitemporal hemianopia if large",
"Surgery; bilateral adrenalectomy if surgery fails"],
["Non-functioning", "No hormones; compression effects",
"Bitemporal hemianopia; visual failure",
"Surgery; annual MRI surveillance if small"],
["Craniopharyngioma", "Hypopituitarism; diabetes insipidus; children",
"Bitemporal INFERIOR hemianopia (from above; superiorly located lesion)",
"Surgery ± Radiotherapy; cyst aspiration"],
],
[3.5*cm, 4*cm, 4.5*cm, 4*cm], TEAL, TEAL, s
))
story.append(sp(6))
story.append(rguhs_box([
"Ophthalmic manifestations of pituitary tumors [Short Essay — 10 marks]",
"Craniopharyngioma — ocular features [Short Essay]",
"Describe clinical findings in 3rd cranial nerve paralysis at different levels [Long Essay — 20 marks]",
"Describe the visual field defects in glaucoma and their relevance to diagnosis and management [Long Essay]",
], s))
story.append(sp(8))
story.append(PageBreak())
# ══════════════════════════════════════
# CHAPTER 4: 3RD NERVE PALSY
# ══════════════════════════════════════
story.append(chapter_header("CHAPTER 4: THIRD CRANIAL NERVE PALSY", HexColor("#1B5E20"), s))
story.append(sp(8))
story.append(Paragraph("4.1 Anatomy — Course of the 3rd Nerve", SH))
story.append(gen_table(
["Segment", "Anatomical Location", "Lesion Produces"],
[
["Nuclear", "Periaqueductal grey matter, midbrain",
"Ipsilateral ptosis + contralateral superior rectus weakness (SR nucleus contralateral); bilateral levator weakness"],
["Fascicular (intra-axial)", "Midbrain — passes through red nucleus and cerebral peduncle",
"Benedict syndrome (+ contralateral tremor); Weber syndrome (+ contralateral hemiplegia)"],
["Subarachnoid", "Exits midbrain, runs between PCA and SCA, alongside PComm artery",
"Pupil-INVOLVING palsy (aneurysm alert!); PComm artery aneurysm — medical emergency"],
["Cavernous sinus", "Runs in lateral wall (superior)",
"Horner + 4th + V1/V2 involvement; pain from V involvement"],
["Superior orbital fissure", "Divides into superior/inferior divisions",
"Similar to cavernous sinus involvement; proptosis possible"],
["Orbit", "Superior division: SR, levator; inferior: MR, IR, IO, sphincter+ciliary via CG",
"Divisional palsies"],
],
[3*cm, 5*cm, 8*cm], GREEN, GREEN, s
))
story.append(sp(6))
story.append(info_box("Clinical Signs of Complete 3rd Nerve Palsy", [
"Ptosis (levator palpebrae involvement)",
"Eye position: Down and OUT (abduction + depression) — unopposed LR and SO",
"Limited adduction (MR palsy), limited elevation (SR + IO), limited depression (IR)",
"Dilated pupil + fixed (parasympathetic palsy) → PUPIL-INVOLVING",
"Loss of accommodation (ciliary muscle)",
"Diplopia (resolved by ptosis masking the eye)",
], LIGHT_GREEN, GREEN, s))
story.append(sp(6))
story.append(two_col_table(
["Pupil INVOLVED (dilated, fixed)", "Usually compressive (aneurysm!)", "Surgical emergency",
"Pupillomotor fibres run on OUTSIDE of nerve", "Vulnerable to external compression",
"PComm aneurysm — most important cause",
"Other: Uncal herniation, posterior fossa tumour, cavernous sinus lesion"],
["Pupil SPARED (normal size, reacting)", "Usually ischaemic (diabetic, hypertensive)",
"Central fibres affected by ischaemia; outer fibres survive",
"Underlying cause: DM, HTN, atherosclerosis",
"Pain can occur in ischaemic palsy too",
"Treatment: Control risk factors; usually resolves in 3–6 months",
"If pupil-sparing and no vascular risk factors — investigate for compression"],
["Pupil-INVOLVING 3rd Palsy", "Pupil-SPARING 3rd Palsy"],
LIGHT_GREEN, GREEN, s
))
story.append(sp(6))
story.append(mnemonic_box(
"Weber vs Benedict Syndrome",
"Weber = W for Walking (hemiplegia) | Benedict = Basal ganglia (tremor)",
[
["Weber Syndrome", "3rd nerve palsy + contralateral hemiplegia (cerebral peduncle)"],
["Benedict Syndrome", "3rd nerve palsy + contralateral tremor/ataxia (red nucleus + superior cerebellar)"],
["Nothnagel Syndrome", "3rd nerve palsy + ipsilateral cerebellar ataxia (superior cerebellar peduncle)"],
["Claude Syndrome", "Benedict + Nothnagel combined"],
], s
))
story.append(sp(6))
story.append(Paragraph("4.2 Aberrant Regeneration of 3rd Nerve", SH))
story.append(Paragraph(
"Occurs after traumatic/compressive 3rd nerve palsy (NOT ischaemic — endoneural sheaths intact in ischaemia). "
"Misdirected axons re-innervate wrong muscles.", B))
story.append(gen_table(
["Sign", "Mechanism"],
[
["Pseudo-Graefe / Pseudo-von Graefe sign", "Lid elevates on downgaze — IR axons → levator"],
["Lid elevation on adduction", "MR axons → levator"],
["Pupil constricts on downgaze or adduction", "IR or MR axons → sphincter pupillae"],
["Inverse Duane sign", "Globe retraction on attempted adduction — convergence innervation"],
],
[6*cm, 10*cm], GREEN, GREEN, s
))
story.append(sp(6))
story.append(rguhs_box([
"Describe the clinical findings in 3rd cranial nerve paralysis at different levels [Long Essay — 20 marks]",
"Aberrant third nerve [Short Essay — 10 marks]",
"Weber syndrome [Short Essay]",
"Discuss pupil-sparing vs pupil-involving 3rd nerve palsy [Short Essay]",
], s))
story.append(sp(8))
story.append(PageBreak())
# ══════════════════════════════════════
# CHAPTER 5: 4TH NERVE PALSY
# ══════════════════════════════════════
story.append(chapter_header("CHAPTER 5: FOURTH CRANIAL NERVE PALSY (TROCHLEAR)", HexColor("#4A148C"), s))
story.append(sp(8))
story.append(Paragraph("Key Facts", SH))
story.append(gen_table(
["Feature", "Details"],
[
["Muscle", "Superior oblique (SO) — longest intracranial course, only nerve to exit dorsally from brainstem"],
["Action of SO", "Primary: Intorsion | Secondary: Depression (in adduction) | Tertiary: Abduction"],
["Signs", "Ipsilateral hypertropia (eye higher); excyclotorsion; head tilt to opposite shoulder (compensatory)"],
["Head tilt test (Bielschowsky)", "Tilting head to SAME side → hyperdeviation increases (positive test)"],
["Parks 3-step test", "Step 1: Which eye higher? | Step 2: Which gaze worse? | Step 3: Head tilt which side worse?"],
["Causes", "Congenital (most common overall), trauma (most common acquired), vascular, idiopathic"],
["Bilateral 4th palsy", "Head trauma; V pattern esotropia; excyclotorsion > 10°; large hypertropia in primary"],
["Treatment", "Prism glasses for small deviations; surgery (Harada-Ito, SO tuck) for significant diplopia"],
],
[5*cm, 11*cm], PURPLE, PURPLE, s
))
story.append(sp(6))
story.append(rguhs_box([
"4th cranial nerve palsy — clinical features and management [Short Essay]",
"Parks 3-step test [Short Essay]",
"Bielschowsky head tilt test [Short Essay]",
], s))
story.append(sp(8))
# ══════════════════════════════════════
# CHAPTER 6: 6TH NERVE PALSY
# ══════════════════════════════════════
story.append(chapter_header("CHAPTER 6: SIXTH CRANIAL NERVE PALSY (ABDUCENS)", HexColor("#004D40"), s))
story.append(sp(8))
story.append(gen_table(
["Segment", "Anatomical Notes", "Syndrome / Cause"],
[
["Nuclear/Fascicular", "Abducens nucleus + PPRF; dorsal pons",
"Foville syndrome: ipsilateral 6th + ipsilateral horizontal gaze palsy + ipsilateral facial nerve palsy"],
["Subarachnoid (basilar)", "Runs up along clivus; crossed by AICA",
"Vestibular schwannoma (hearing loss + reduced corneal reflex); Raised ICP — false localizing sign"],
["Petrous apex", "Passes under petroclinoid ligament (Gruber ligament) through Dorello canal",
"Gradenigo syndrome: 6th palsy + facial pain (V) + deafness — from petrositis/mastoiditis"],
["Cavernous sinus", "Most medial nerve in sinus; related to ICA",
"Parkinson syndrome: 6th palsy + postganglionic Horner; multiple CN palsies"],
["Intraorbital", "Enters through annulus of Zinn to LR",
"Isolated LR palsy; trauma"],
],
[3.5*cm, 5*cm, 7.5*cm], HexColor("#004D40"), HexColor("#004D40"), s
))
story.append(sp(6))
story.append(info_box("Clinical Features of 6th Nerve Palsy", [
"Convergent squint (esotropia) in primary position",
"Diplopia — horizontal, uncrossed (homonymous)",
"Head turn towards the side of the palsy (compensatory) to avoid diplopia",
"Limited abduction of affected eye",
"MOST COMMON ocular motor nerve palsy",
"Raised ICP: BILATERAL 6th nerve palsies — false localizing sign (not localising to brainstem)",
], LIGHT_TEAL, TEAL, s))
story.append(sp(6))
story.append(rguhs_box([
"Gradenigo syndrome [Short Essay — 10 marks]",
"6th nerve palsy — causes at different levels [Short Essay]",
"False localizing signs in raised ICP [Short Essay]",
"Foville syndrome [Short Essay]",
], s))
story.append(sp(8))
story.append(PageBreak())
# ══════════════════════════════════════
# CHAPTER 7: PUPILS
# ══════════════════════════════════════
story.append(chapter_header("CHAPTER 7: PUPILLARY ABNORMALITIES", HexColor("#E65100"), s))
story.append(sp(8))
story.append(Paragraph("7.1 Relative Afferent Pupillary Defect (RAPD) — Marcus Gunn Pupil", SH))
story.append(Paragraph(
"RAPD indicates asymmetric optic nerve dysfunction. Tested with the <b>swinging flashlight test</b>: "
"the affected eye dilates when light swings to it (paradoxical dilatation).", B))
story.append(info_box("Causes of RAPD", [
"Optic neuritis (commonest cause in young adults)",
"AION / AAION",
"Compressive optic neuropathy",
"Severe retinal disease (CRAO, extensive RD, advanced glaucoma)",
"NOT seen in: Amblyopia, refractive error, cataract, corneal opacity (media opacities)",
"NOT present if equal bilateral optic nerve disease",
], LIGHT_ORANGE, ORANGE, s))
story.append(sp(6))
story.append(Paragraph("7.2 Horner Syndrome (Oculosympathetic Palsy)", SH))
story.append(Paragraph(
"Results from disruption of the 3-neurone sympathetic pathway to the eye.", B))
story.append(sp(4))
story.append(gen_table(
["Order", "Neurone", "Course", "Causes"],
[
["1st order\n(Central)", "Hypothalamus → ciliospinal centre of Budge (C8–T2)",
"Brainstem → spinal cord",
"Brainstem stroke, tumour, demyelination, syringomyelia, Wallenberg syndrome"],
["2nd order\n(Preganglionic)", "Ciliospinal centre → superior cervical ganglion",
"Exits C8–T2 → over apex of lung → along subclavian and common carotid",
"Pancoast tumour (lung apex), cervical rib, thyroid mass, aortic arch aneurysm, neck surgery"],
["3rd order\n(Postganglionic)", "Superior cervical ganglion → eye",
"Along ICA (dilator + SM of upper lid + lower lid) and ECA (sudomotor)",
"Carotid artery dissection, cavernous sinus lesion, cluster headache (painful Horner)"],
],
[2.5*cm, 3.5*cm, 4.5*cm, 5.5*cm], ORANGE, ORANGE, s
))
story.append(sp(4))
story.append(gen_table(
["Clinical Feature", "Notes"],
[
["Miosis", "Small pupil; anisocoria greater in dim light (failure to dilate)"],
["Partial ptosis", "2–3 mm; from Müller muscle paresis"],
["Lower lid elevation (upside-down ptosis / inverse ptosis)", "From inferior tarsal muscle"],
["Enophthalmos (apparent)", "From narrowed palpebral fissure; not true enophthalmos"],
["Anhidrosis of face", "1st/2nd order lesions (sudomotor fibres travel with ECA); absent in 3rd order"],
["Heterochromia", "Congenital Horner — affected iris lighter (failure of melanogenesis)"],
],
[5.5*cm, 10.5*cm], ORANGE, ORANGE, s
))
story.append(sp(4))
story.append(info_box("Pharmacological Testing for Horner Syndrome", [
"Cocaine 4–10% (or Apraclonidine 0.5–1%): Confirms Horner — no dilation of Horner pupil with cocaine; apraclonidine reverses anisocoria",
"Hydroxyamphetamine 1%: Differentiates pre- vs post-ganglionic. Pre/1st order dilates; Post-ganglionic (3rd order) does NOT dilate",
"Phenylephrine 1%: Dilates postganglionic Horner (denervation supersensitivity)",
"INVESTIGATION: CT/MR angiography from aortic arch to circle of Willis to exclude compressive/vascular lesion",
"Acute Horner: EMERGENCY — rule out carotid dissection with urgent CTA",
], LIGHT_ORANGE, ORANGE, s))
story.append(sp(6))
story.append(Paragraph("7.3 Adie (Tonic) Pupil", SH))
story.append(gen_table(
["Feature", "Details"],
[
["Mechanism", "Postganglionic parasympathetic denervation — ciliary ganglion + short ciliary nerves"],
["Demographics", "Young women (20–40 years); unilateral in 80% initially"],
["Pupil", "LARGE, irregular; light reflex absent or very sluggish"],
["Near response", "Light-near DISSOCIATION — slow constriction to near (tonicity); slow re-dilation"],
["Slit-lamp", "Vermiform (worm-like) movements of pupil border — pathognomonic"],
["Accommodation", "Impaired — blurring for near; cycloplegia-like"],
["Pharmacological test", "0.1% pilocarpine (dilute) — CONSTRICTS Adie pupil (denervation supersensitivity); no effect on normal"],
["Holmes-Adie syndrome", "Adie pupil + absent lower limb deep tendon reflexes"],
["Ross syndrome", "Holmes-Adie + segmental anhidrosis"],
],
[4.5*cm, 11.5*cm], ORANGE, ORANGE, s
))
story.append(sp(6))
story.append(Paragraph("7.4 Argyll Robertson Pupil (ARP)", SH))
story.append(info_box("Argyll Robertson Pupil — Key Features (Syphilis)", [
"Bilateral, small, irregular pupils",
"Light reflex ABSENT",
"Near reflex PRESERVED → Classic light-near DISSOCIATION",
"Cause: Neurosyphilis (tertiary) — lesion in pretectal area of midbrain (intercalated neurons)",
"Other causes of light-near dissociation: Parinaud syndrome, Adie, diabetes (rare), Wernicke",
"Mnemonic: 'ARP — A = Accommodates, R = Reacts to near, P = Pupils small'",
"CANNOT be dilated pharmacologically (poor response to mydriatics)",
], LIGHT_PURPLE, PURPLE, s))
story.append(sp(6))
story.append(rguhs_box([
"Horner syndrome — causes, clinical features, pharmacological testing [Short Essay — 10 marks]",
"Argyll Robertson pupil [Short Essay — 10 marks]",
"Relative afferent pupillary defect (RAPD) — swinging flashlight test [Short Essay]",
"Adie tonic pupil [Short Essay]",
], s))
story.append(sp(8))
story.append(PageBreak())
# ══════════════════════════════════════
# CHAPTER 8: MYASTHENIA GRAVIS
# ══════════════════════════════════════
story.append(chapter_header("CHAPTER 8: MYASTHENIA GRAVIS — OCULAR FEATURES", RED, s))
story.append(sp(8))
story.append(Paragraph(
"Myasthenia Gravis (MG) is an autoimmune disease caused by antibodies against nicotinic acetylcholine "
"receptors (AChR) at the neuromuscular junction. It is the most common cause of bilateral ptosis "
"with ocular motility disturbance in adults.", B))
story.append(sp(6))
story.append(gen_table(
["Feature", "Details"],
[
["Autoantibodies", "Anti-AChR (85% of generalized; 50% of ocular); anti-MuSK (10%); anti-LRP4"],
["Ocular MG", "Ptosis + ophthalmoplegia WITHOUT pupil involvement (pupil-sparing)"],
["Ptosis", "FATIGUABLE ptosis — worsens with sustained upgaze; may alternate between eyes"],
["Cogan lid twitch", "Brief upward overshoot of lid on return to primary position from downgaze — PATHOGNOMONIC"],
["Ophthalmoplegia", "Variable, may mimic any nerve palsy; characteristically variable and fatiguing"],
["Pupil", "NORMAL — distinguishes from 3rd nerve palsy"],
["Peek sign", "Unable to sustain lid closure on forced closure — eyelashes 'peek' through"],
["Ice pack test", "Ptosis improves after applying ice pack for 2 minutes (cold improves NMJ function)"],
["Tension test", "Edrophonium (Tensilon) — IV; ptosis improves within seconds; risk of bradycardia; atropine on standby"],
["Pyridostigmine test", "Oral; used therapeutically and diagnostically (improvement within 30 min)"],
["Investigations", "Anti-AChR Ab; repetitive nerve stimulation (decremental response); single-fibre EMG (SFEMG — most sensitive); CT chest (thymoma)"],
["Associated conditions", "Thymoma (15%); other autoimmune diseases"],
["Treatment: Ocular", "Artificial tears; prisms; ptosis crutches; pilocarpine for accommodative problems"],
["Treatment: Medical", "Pyridostigmine (first line); prednisolone; azathioprine; mycophenolate; IVIG; plasmapheresis"],
["Treatment: Surgical", "Thymectomy (indicated for thymoma; benefits non-thymoma generalized MG)"],
["Myasthenic crisis", "Respiratory failure; triggered by infection, surgery, drugs; Rx: IVIG, plasmapheresis, ICU"],
],
[5*cm, 11*cm], RED, RED, s
))
story.append(sp(6))
story.append(mnemonic_box(
"MG Diagnosis Steps (RGUHS Standard Answer)",
"ICE PACK → TENSION → SEROLOGY → EMG → CHEST CT",
[
["Ice pack test", "Simple bedside test; cold improves AChE activity"],
["Tensilon (Edrophonium)", "AChE inhibitor; dramatic but brief improvement of ptosis"],
["Serology", "Anti-AChR, anti-MuSK antibodies"],
["EMG", "Repetitive stimulation; SFEMG most sensitive"],
["CT Chest", "Look for thymoma"],
], s
))
story.append(sp(6))
story.append(rguhs_box([
"Discuss the pathogenesis, ocular manifestations, diagnosis and treatment of myasthenia gravis [Long Essay — 20 marks]",
"Ocular myasthenia — differentiation from 3rd nerve palsy [Short Essay — 10 marks]",
"Edrophonium (Tensilon) test [Short Essay]",
"Thymoma and myasthenia gravis [Short Essay]",
], s))
story.append(sp(8))
story.append(PageBreak())
# ══════════════════════════════════════
# CHAPTER 9: NYSTAGMUS
# ══════════════════════════════════════
story.append(chapter_header("CHAPTER 9: NYSTAGMUS", HexColor("#1A237E"), s))
story.append(sp(8))
story.append(Paragraph("Definition: Involuntary, rhythmic oscillation of the eyes.", B))
story.append(sp(4))
story.append(gen_table(
["Type", "Key Features", "Causes"],
[
["Pendular nystagmus", "Equal velocity in both directions; sinusoidal",
"Spasmus nutans, albinism, congenital (early onset)"],
["Jerk nystagmus", "Slow drift one direction, fast corrective saccade; named by fast phase",
"Vestibular, cerebellar, gaze-evoked"],
["Horizontal jerk", "Most common; fast phase named", "Acute vestibular neuritis, cerebellar disease"],
["Vertical jerk — upbeat", "Upward fast phase", "Brainstem lesion (anterior vermis, medulla)"],
["Vertical jerk — downbeat", "Downward fast phase; worsens on lateral gaze",
"Craniocervical junction lesion (Arnold-Chiari), cerebellar, lithium toxicity"],
["Ataxic nystagmus (INO)", "Abducting eye — larger amplitude",
"Internuclear ophthalmoplegia (MS); lesion in MLF"],
["Gaze-evoked nystagmus", "Only in eccentric gaze", "Cerebellar disease, drugs (anticonvulsants, sedatives)"],
["Latent nystagmus", "Only with one eye covered; fast phase toward uncovered eye",
"Congenital esotropia"],
["Seesaw nystagmus", "One eye rises + intorts while other falls + extorts",
"Chiasmal/parachiasmal lesions (craniopharyngioma, pituitary)"],
["Convergence-retraction nystagmus", "Eyes converge/retract on attempted upgaze",
"Parinaud syndrome (dorsal midbrain)"],
],
[4*cm, 5.5*cm, 6.5*cm], DARK_BLUE, DARK_BLUE, s
))
story.append(sp(6))
story.append(info_box("Parinaud Syndrome (Dorsal Midbrain Syndrome) — RGUHS Favourite", [
"Causes: Pineal gland tumour, aqueductal stenosis, multiple sclerosis, midbrain infarct",
"Features: Upgaze palsy (most prominent), convergence-retraction nystagmus on attempted upgaze",
"Light-near dissociation of pupils (near reflex intact, light reflex absent)",
"Convergence retraction nystagmus — pathognomonic of dorsal midbrain lesion",
"Collier sign — bilateral lid retraction (Collier's tucked-up lids)",
"Skew deviation possible",
], LIGHT_BLUE, MED_BLUE, s))
story.append(sp(6))
story.append(Paragraph("9.1 Internuclear Ophthalmoplegia (INO)", SH))
story.append(gen_table(
["Feature", "Details"],
[
["Lesion", "Medial Longitudinal Fasciculus (MLF) — connects abducens nucleus to contralateral 3rd nucleus"],
["Signs", "Adduction palsy of ipsilateral eye + abduction nystagmus of contralateral eye"],
["Convergence", "Normal convergence (distinguishes from 3rd nerve palsy medial rectus)"],
["WEBINO syndrome", "Wall-eyed bilateral INO — bilateral adduction palsy + exotropia; pontine lesion"],
["ONE-AND-HALF syndrome", "Ipsilateral gaze palsy + INO; only contralateral abduction intact"],
["Causes (bilateral)", "MS (young patient) — most common cause"],
["Causes (unilateral)", "Vascular (elderly) — most common cause"],
],
[4.5*cm, 11.5*cm], MED_BLUE, MED_BLUE, s
))
story.append(sp(6))
story.append(rguhs_box([
"Nystagmus — classification and clinical significance [Short Essay]",
"Internuclear ophthalmoplegia [Short Essay]",
"Parinaud syndrome [Short Essay]",
"Congenital nystagmus vs. acquired nystagmus [Short Essay]",
], s))
story.append(sp(8))
story.append(PageBreak())
# ══════════════════════════════════════
# CHAPTER 10: IIH / PAPILLOEDEMA
# ══════════════════════════════════════
story.append(chapter_header("CHAPTER 10: PAPILLOEDEMA & IDIOPATHIC INTRACRANIAL HYPERTENSION (IIH)", MED_BLUE, s))
story.append(sp(8))
story.append(Paragraph("10.1 Papilloedema", SH))
story.append(Paragraph(
"Papilloedema is bilateral disc swelling due to raised intracranial pressure. "
"The optic nerve sheath communicates with the subarachnoid space — raised ICP is transmitted "
"causing axoplasmic flow obstruction and disc swelling.", B))
story.append(sp(4))
story.append(gen_table(
["Stage", "Ophthalmoscopic Features"],
[
["Early", "C-shaped haemorrhages around disc; blurring of superior/inferior margins; loss of spontaneous venous pulsations (SVP)"],
["Established", "360° disc swelling; surface haemorrhages + exudates; venous engorgement; cotton-wool spots"],
["Chronic", "Disc elevation; radial retinal folds (Paton lines) around disc; haemorrhages resolve"],
["Atrophic", "Disc pallor + gliosis; secondary optic atrophy; poor visual prognosis"],
],
[3.5*cm, 12.5*cm], MED_BLUE, MED_BLUE, s
))
story.append(sp(6))
story.append(info_box("Papilloedema vs Pseudopapilloedema", [
"True papilloedema: Absent SVP; peripapillary haemorrhages; vessels obscured at disc margin",
"Pseudopapilloedema: SVP present; no haemorrhages; drusen (glistening bodies); elevated disc margin without swelling",
"Optic disc drusen: Autofluorescent on FAF; detectable on ultrasound (high reflectivity)",
"B-scan ultrasound: Drusen — echogenic deposits at disc; papilloedema — optic nerve sheath distension (> 5.5 mm)",
"OCT: Can differentiate — nerve fibre layer elevation patterns differ",
], LIGHT_BLUE, MED_BLUE, s))
story.append(sp(6))
story.append(Paragraph("10.2 Idiopathic Intracranial Hypertension (IIH) / Pseudotumour Cerebri", SH))
story.append(gen_table(
["Feature", "Details"],
[
["Demographics", "Obese women of childbearing age (90% of cases)"],
["Symptoms", "Headache (>90%), pulsatile tinnitus, visual obscurations, horizontal diplopia (6th nerve palsy)"],
["Modified Dandy Criteria", "1. Papilloedema; 2. Normal neurological exam (except 6th nerve palsy); 3. Normal neuroimaging (empty sella, slit ventricles); 4. Normal CSF composition; 5. Elevated CSF opening pressure (>25 cmH₂O)"],
["Investigations", "MRI brain + MRV (exclude sinus thrombosis); LP (opening pressure, CSF analysis)"],
["Medical Treatment", "Weight loss (most effective long-term); Acetazolamide (first-line drug); Furosemide; Topiramate"],
["Surgical Treatment", "Optic nerve sheath decompression (fenestration); Lumboperitoneal/ventriculoperitoneal shunt; Transverse sinus stenting"],
["Visual monitoring", "VA, colour vision, visual fields (automated perimetry), disc photography regularly"],
],
[4*cm, 12*cm], MED_BLUE, MED_BLUE, s
))
story.append(sp(6))
story.append(rguhs_box([
"Pseudotumour cerebri (IIH) — features, diagnosis and treatment [Short Essay — 10 marks]",
"Pseudo-papilloedema [Short Essay]",
"Differentiate papilloedema from optic disc drusen [Short Essay]",
"Blood supply of optic nerve head [Long Essay]",
], s))
story.append(sp(8))
story.append(PageBreak())
# ══════════════════════════════════════
# CHAPTER 11: MISC HIGH-YIELD TOPICS
# ══════════════════════════════════════
story.append(chapter_header("CHAPTER 11: HIGH-YIELD MISCELLANEOUS TOPICS", HexColor("#37474F"), s))
story.append(sp(8))
# Sturge Weber
story.append(Paragraph("11.1 Sturge-Weber Syndrome", SH))
story.append(gen_table(
["Feature", "Details"],
[
["Type", "Encephalofacial (port-wine) angiomatosis; phakomatosis"],
["Ocular features", "Ipsilateral glaucoma (30–70%; infantile/juvenile), choroidal haemangioma (diffuse; 'tomato ketchup fundus'), vascular malformations of episclera/conjunctiva"],
["Systemic features", "Port-wine stain (V1/V2 territory), epilepsy, contralateral hemiplegia, intellectual disability, intracranial calcification ('tram-track' on CT)"],
["Glaucoma mechanism", "Elevated episcleral venous pressure + anterior chamber angle anomaly"],
["Treatment", "Glaucoma: Medical → surgical (trabeculotomy/goniotomy); Choroidal haemangioma: PDT/laser; Skin: Laser"],
],
[4*cm, 12*cm], HexColor("#37474F"), HexColor("#37474F"), s
))
story.append(sp(6))
# Ocular Cysticercosis
story.append(Paragraph("11.2 Ocular Cysticercosis", SH))
story.append(gen_table(
["Feature", "Details"],
[
["Organism", "Taenia solium (pork tapeworm) cysticercus cellulosae"],
["Ocular sites", "Subretinal (most common), vitreous, subconjunctival, orbit, anterior chamber"],
["Subretinal cysticercus", "White cyst with scolex; retinal detachment; uveitis; disc oedema"],
["Intraocular diagnosis", "B-scan ultrasound — double-walled cyst with echogenic scolex; scolex movement"],
["Systemic diagnosis", "CT/MRI brain (calcified lesions, ring-enhancing); serology (ELISA); eosinophilia"],
["Treatment", "Intraocular: Pars plana vitrectomy (surgical removal; antiparasitics risk inflammation); Systemic CNS: Albendazole 15mg/kg + steroids"],
],
[4*cm, 12*cm], HexColor("#37474F"), HexColor("#37474F"), s
))
story.append(sp(6))
# Giant Cell Arteritis summary
story.append(Paragraph("11.3 Giant Cell Arteritis (GCA) — Emergency Summary", SH))
story.append(info_box("GCA — Must-Know Points for RGUHS", [
"Age > 55 years; women > men; F:M = 3:1",
"Symptoms: Headache (temporal), jaw claudication (pathognomonic), scalp tenderness, fever, weight loss, PMR",
"Ocular emergency: AAION — sudden profound visual loss; pale disc swelling; chalky white oedema",
"ESR > 50 mm/hr, CRP elevated; IL-6 elevated; normochromic anaemia",
"Temporal artery biopsy: granulomatous inflammation with giant cells; skip lesions (take ≥ 2 cm; bilateral if needed)",
"TREATMENT: Start IV methylprednisolone 500–1000 mg × 3 days BEFORE biopsy (do not delay)",
"Oral prednisolone 1 mg/kg for maintenance; slow taper over 1–2 years",
"Second eye at risk: 25–50% of untreated patients lose vision in second eye within days–weeks",
"Aspirin 75 mg added — reduces risk of stroke/visual loss",
], LIGHT_RED, RED, s))
story.append(sp(6))
# Congenital Cranial Nerve Anomalies
story.append(Paragraph("11.4 Duane Retraction Syndrome (DRS)", SH))
story.append(gen_table(
["Type", "Abduction", "Adduction", "Retraction / Narrowing"],
[
["Type I (most common)", "Limited/absent", "Normal/slightly limited", "On adduction"],
["Type II", "Normal", "Limited/absent", "On adduction"],
["Type III", "Limited/absent", "Limited/absent", "On adduction"],
],
[4*cm, 4*cm, 4*cm, 4*cm], HexColor("#37474F"), HexColor("#37474F"), s
))
story.append(Paragraph(
"Cause: Absence/hypoplasia of abducens nucleus; aberrant innervation of LR by 3rd nerve branches. "
"Most cases left eye; female predominance. Surgery only if significant head turn or cosmetically unacceptable.", B))
story.append(sp(6))
# Marcus Gunn jaw-winking
story.append(Paragraph("11.5 Marcus Gunn Jaw-Winking Phenomenon", SH))
story.append(Paragraph(
"Synkinesis between pterygoid muscles (V3) and levator palpebrae (CN III). "
"Ptosis improves/lid elevates with opening mouth/moving jaw. "
"Cause: Aberrant innervation from the pterygoid motor nucleus. "
"Treatment: Levator resection or bilateral Fasanella-Servat; severe cases: bilateral levator disinsertion + frontalis sling.", B))
story.append(sp(6))
story.append(rguhs_box([
"Sturge-Weber syndrome [Short Essay — 10 marks]",
"Ocular cysticercosis [Short Essay — 10 marks]",
"Duane retraction syndrome [Short Essay]",
"Marcus Gunn jaw-winking phenomenon [Short Essay]",
"Giant cell arteritis — ophthalmic manifestations and emergency management [Long Essay]",
], s))
story.append(sp(8))
story.append(PageBreak())
# ══════════════════════════════════════
# CHAPTER 12: QUICK REVISION TABLE
# ══════════════════════════════════════
story.append(chapter_header("CHAPTER 12: RAPID REVISION — EXAM QUICK REFERENCE", HexColor("#B71C1C"), s))
story.append(sp(8))
story.append(Paragraph("Key Drug Doses — Neuro-Ophthalmology", SH))
story.append(gen_table(
["Drug", "Indication", "Dose / Route", "Key Point"],
[
["Methylprednisolone IV", "Optic neuritis", "1g/day × 3 days", "Speeds recovery, no final VA benefit"],
["Methylprednisolone IV", "GCA / AAION", "500–1000 mg × 3 days", "Give BEFORE biopsy"],
["Prednisolone oral", "GCA maintenance", "1 mg/kg/day", "Slow taper over 1–2 years"],
["Acetazolamide", "IIH / Papilloedema", "250–500 mg BD–QID", "Carbonic anhydrase inhibitor; first-line"],
["Pyridostigmine", "Myasthenia gravis", "30–60 mg TDS–QID", "AChE inhibitor; first-line symptomatic"],
["Edrophonium", "MG diagnosis (Tensilon test)", "2 mg IV test dose + 8 mg IV", "Short-acting; atropine standby"],
["Idebenone", "LHON", "900 mg/day", "Best evidence for 11778 mutation"],
["Cabergoline", "Prolactinoma", "0.25 mg twice weekly", "First-line medical for prolactinoma"],
],
[4*cm, 3.5*cm, 4*cm, 4.5*cm], RED, RED, s
))
story.append(sp(6))
story.append(Paragraph("Important Syndromes — One-liner Revision", SH))
story.append(gen_table(
["Syndrome", "Components", "Lesion Site"],
[
["Weber", "3rd palsy + contralateral hemiplegia", "Midbrain — cerebral peduncle"],
["Benedict", "3rd palsy + contralateral tremor/ataxia", "Midbrain — red nucleus + SCP"],
["Parinaud / Sylvian aqueduct", "Upgaze palsy + CRNN + light-near dissociation + Collier sign", "Dorsal midbrain"],
["Foville", "6th + ipsilateral gaze palsy + ipsilateral 7th palsy", "Pontine tegmentum"],
["Millard-Gubler", "6th + 7th palsy + contralateral hemiplegia", "Pons (ventral)"],
["Gradenigo", "6th palsy + facial pain (V) + deafness", "Petrous apex"],
["Tolosa-Hunt", "Painful ophthalmoplegia (3rd, 4th, V1, 6th)", "Cavernous sinus — granuloma; steroid responsive"],
["INO", "Adduction palsy + abducting nystagmus", "MLF (unilateral: vascular; bilateral: MS)"],
["ONE-AND-HALF", "Ipsilateral gaze palsy + INO", "Ipsilateral PPRF + MLF"],
["DIDMOAD (Wolfram)", "Diabetes Insipidus, DM, Optic Atrophy, Deafness", "Mitochondrial/AR; WFS1 gene"],
["Holmes-Adie", "Adie pupil + absent ankle jerks", "Ciliary ganglion + dorsal root ganglion"],
["Balint syndrome", "Optic ataxia + Ocular apraxia + Simultanagnosia", "Bilateral parieto-occipital"],
],
[4*cm, 6.5*cm, 5.5*cm], RED, RED, s
))
story.append(sp(6))
story.append(Paragraph("Visual Field Defects — Quick Localization Chart", SH))
story.append(gen_table(
["Defect Type", "Site", "Cause (Most Likely)"],
[
["Monocular blindness", "Optic nerve (ipsilateral)", "Optic neuritis / AION / TON"],
["Junctional scotoma", "Anterior chiasm junction", "Pituitary adenoma (postfixed chiasm)"],
["Bitemporal hemianopia", "Chiasm (central)", "Pituitary macroadenoma"],
["Bitemporal inferior quadrantanopia", "Chiasm (superior)", "Craniopharyngioma"],
["Incongruous homonymous hemianopia", "Optic tract / LGN", "Craniopharyngioma; vascular"],
["Pie in floor (inferior quadrant)", "Parietal optic radiation", "Parietal lobe stroke/tumour"],
["Pie in sky (superior quadrant)", "Temporal (Meyer loop) radiation", "Temporal lobe / TL surgery"],
["Congruous homonymous + macular sparing", "Occipital cortex", "PCA infarction"],
["Bilateral concentric constriction", "Bilateral / functional", "Retinitis pigmentosa; hysteria"],
],
[5*cm, 5*cm, 6*cm], MED_BLUE, MED_BLUE, s
))
story.append(sp(8))
# Final page
story.append(PageBreak())
story.append(chapter_header("RGUHS PAST PAPER ANALYSIS — NEURO-OPHTHALMOLOGY", HexColor("#1B5E20"), s))
story.append(sp(8))
story.append(gen_table(
["Topic", "Marks", "Frequency (RGUHS)", "Type"],
[
["Myasthenia Gravis — full discussion", "20", "★★★★★", "Long Essay"],
["3rd nerve palsy at different levels", "20", "★★★★★", "Long Essay"],
["Giant Cell Arteritis / AAION", "20", "★★★★", "Long Essay"],
["Blood supply of optic nerve head", "20", "★★★★", "Long Essay"],
["Optic neuritis + MS relationship", "10–20", "★★★★★", "Both"],
["Horner syndrome", "10", "★★★★★", "Short Essay"],
["Pseudotumour cerebri (IIH)", "10", "★★★★", "Short Essay"],
["Traumatic optic neuropathy", "10", "★★★★", "Short Essay"],
["Pituitary tumour — ocular manifestations", "10", "★★★★", "Short Essay"],
["Leber hereditary optic neuropathy", "10", "★★★★", "Short Essay"],
["Argyll Robertson pupil", "10", "★★★★", "Short Essay"],
["Optic atrophy — types and causes", "10", "★★★", "Short Essay"],
["Craniopharyngioma", "10", "★★★", "Short Essay"],
["Sturge-Weber syndrome", "10", "★★★", "Short Essay"],
["Ocular cysticercosis", "10", "★★★", "Short Essay"],
["Aberrant third nerve", "10", "★★★", "Short Essay"],
["Nystagmus — classification", "10", "★★★", "Short Essay"],
["Pseudo-papilloedema", "10", "★★★", "Short Essay"],
["Gradenigo syndrome", "10", "★★", "Short Essay"],
["Duane retraction syndrome", "10", "★★", "Short Essay"],
],
[6*cm, 2*cm, 3.5*cm, 4.5*cm], GREEN, GREEN, s
))
story.append(sp(12))
footer_data = [[
Paragraph(
"<i>Based on: Kanski's Clinical Ophthalmology 10th Ed | RGUHS Past Papers (2006–2024) | "
"Orris Medical Education | For educational use only</i>",
ParagraphStyle("Footer", parent=s["styles"]["Normal"],
fontSize=8, fontName="Helvetica-Oblique",
textColor=MED_GRAY, alignment=TA_CENTER))
]]
footer_t = Table(footer_data, colWidths=[W - 3.6*cm])
footer_t.setStyle(TableStyle([
("TOPPADDING", (0,0), (-1,-1), 8),
("LINEABOVE", (0,0), (-1,-1), 1, MED_GRAY),
]))
story.append(footer_t)
return story
def add_page_numbers(canvas, doc):
canvas.saveState()
canvas.setFont("Helvetica", 8)
canvas.setFillColor(MED_GRAY)
page_num = canvas.getPageNumber()
canvas.drawRightString(W - 1.8*cm, 1.2*cm, f"Page {page_num}")
canvas.drawString(1.8*cm, 1.2*cm, "RGUHS Neuro-Ophthalmology | Orris Medical Education")
canvas.restoreState()
def main():
doc = make_doc()
s = make_styles()
story = build_story(s)
doc.build(story, onFirstPage=add_page_numbers, onLaterPages=add_page_numbers)
print(f"PDF generated: {OUTPUT_PATH}")
if __name__ == "__main__":
main()
cd /home/daytona/workspace/neuro-ophthalmology && python3 generate_notes.py 2>&1
ls -lh /home/daytona/workspace/neuro-ophthalmology/RGUHS_Neuro_Ophthalmology_Notes.pdf
RGUHS Neuro Ophthalmology Notes
PDF Document · PDF
| Chapter | Topic |
|---|---|
| 1 | Optic nerve anatomy, blood supply, VEP, Optic Neuritis (ONTT), AION vs AAION, TON |
| 2 | Optic Atrophy — primary/secondary/consecutive, LHON mutations & treatment |
| 3 | Visual pathway defects — localisation chart, chiasmal lesions, pituitary tumors |
| 4 | 3rd Nerve Palsy — nuclear to orbital, Weber/Benedict/Nothnagel syndromes, aberrant regeneration |
| 5 | 4th Nerve Palsy — Parks 3-step, Bielschowsky test |
| 6 | 6th Nerve Palsy — Gradenigo, Foville, false localizing sign |
| 7 | Pupils — Horner (pharmacological tests), Adie, RAPD, Argyll Robertson |
| 8 | Myasthenia Gravis — full long-essay coverage including Tensilon test, SFEMG, thymectomy |
| 9 | Nystagmus — all types, INO, Parinaud syndrome |
| 10 | Papilloedema, IIH/Pseudotumour Cerebri — Modified Dandy criteria, treatment |
| 11 | Sturge-Weber, Ocular Cysticercosis, GCA emergency, Duane, Marcus Gunn |
| 12 | Rapid revision — drug doses, syndrome one-liners, RGUHS frequency analysis (20 topics ranked by frequency) |