Hey orris
I need complete anatomy of ear , nose , throat which will help me in studying ENT subject in detail including diagrams with labels and theirs discription, details theory relevance with easy to understand language and some tricks and tips to learn the relatives position of each of components with summary chart with easy to learn and retaining way for my ENT subject of MBBS
mkdir -p /home/daytona/workspace/ent-anatomy && ls /home/daytona/workspace/ent-a…
Retry
mkdir -p /home/daytona/workspace/ent-anatomy/images && cd /home/daytona/workspac…
~/ent-anatomy/build_pdf.py
#!/usr/bin/env python3
"""
ENT Anatomy - Complete Study Guide PDF
Comprehensive notes for MBBS ENT subject
"""
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import cm, mm
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
PageBreak, Image, HRFlowable, KeepTogether
)
from reportlab.platypus.flowables import Flowable
from reportlab.pdfgen import canvas
from reportlab.graphics.shapes import Drawing, Rect, String, Line, Circle, Polygon
from reportlab.graphics import renderPDF
import os
# ─── PATHS ────────────────────────────────────────────────────────────────────
BASE = "/home/daytona/workspace/ent-anatomy"
IMG_DIR = os.path.join(BASE, "images")
OUT = os.path.join(BASE, "ENT_Anatomy_Complete_StudyGuide.pdf")
# ─── COLOUR PALETTE ───────────────────────────────────────────────────────────
C_EAR = colors.HexColor("#1a6fa8") # deep blue – EAR
C_EAR_LT = colors.HexColor("#d6eaf8")
C_NOSE = colors.HexColor("#1e8449") # forest green – NOSE
C_NOSE_LT = colors.HexColor("#d5f5e3")
C_THROAT = colors.HexColor("#a93226") # dark red – THROAT
C_THROAT_LT= colors.HexColor("#fadbd8")
C_GOLD = colors.HexColor("#d4ac0d") # mnemonic gold
C_GOLD_LT = colors.HexColor("#fef9e7")
C_DARK = colors.HexColor("#1c2833")
C_MID = colors.HexColor("#5d6d7e")
C_LIGHT = colors.HexColor("#f2f3f4")
C_WHITE = colors.white
C_HEADER_BG= colors.HexColor("#0d2137")
W, H = A4 # 595.27 x 841.89 pt
# ─── PAGE TEMPLATE ────────────────────────────────────────────────────────────
def on_page(canvas, doc):
canvas.saveState()
# footer bar
canvas.setFillColor(C_HEADER_BG)
canvas.rect(0, 0, W, 18*mm, fill=1, stroke=0)
canvas.setFont("Helvetica", 8)
canvas.setFillColor(C_WHITE)
canvas.drawString(15*mm, 6*mm, "ENT Anatomy — Complete MBBS Study Guide")
canvas.drawRightString(W - 15*mm, 6*mm, f"Page {doc.page}")
# top colour strip
strip_w = W / 3
canvas.setFillColor(C_EAR); canvas.rect(0, H-5*mm, strip_w, 5*mm, fill=1, stroke=0)
canvas.setFillColor(C_NOSE); canvas.rect(strip_w, H-5*mm, strip_w, 5*mm, fill=1, stroke=0)
canvas.setFillColor(C_THROAT); canvas.rect(2*strip_w, H-5*mm, strip_w, 5*mm, fill=1, stroke=0)
canvas.restoreState()
# ─── STYLES ───────────────────────────────────────────────────────────────────
styles = getSampleStyleSheet()
def S(name, **kw):
return ParagraphStyle(name, **kw)
sTitle = S("sTitle",
fontSize=28, leading=34, alignment=TA_CENTER,
textColor=C_WHITE, fontName="Helvetica-Bold", spaceAfter=8)
sSubTitle = S("sSubTitle",
fontSize=13, leading=18, alignment=TA_CENTER,
textColor=colors.HexColor("#aed6f1"), fontName="Helvetica", spaceAfter=6)
sH1 = S("sH1",
fontSize=18, leading=22, textColor=C_WHITE,
fontName="Helvetica-Bold", spaceBefore=12, spaceAfter=6)
sH2 = S("sH2",
fontSize=13, leading=17, textColor=C_DARK,
fontName="Helvetica-Bold", spaceBefore=10, spaceAfter=4)
sH3 = S("sH3",
fontSize=11, leading=14, textColor=C_MID,
fontName="Helvetica-Bold", spaceBefore=7, spaceAfter=3)
sBody = S("sBody",
fontSize=9.5, leading=14, textColor=C_DARK,
fontName="Helvetica", alignment=TA_JUSTIFY, spaceAfter=5)
sBullet = S("sBullet",
fontSize=9.5, leading=13, textColor=C_DARK,
fontName="Helvetica", leftIndent=14, bulletIndent=4,
spaceAfter=3)
sMnemonic = S("sMnemonic",
fontSize=10, leading=14, textColor=colors.HexColor("#6e2f02"),
fontName="Helvetica-Bold", alignment=TA_CENTER)
sMnemonicBody = S("sMnemonicBody",
fontSize=9.5, leading=13, textColor=C_DARK,
fontName="Helvetica", alignment=TA_CENTER, spaceAfter=4)
sCaption = S("sCaption",
fontSize=8, leading=11, textColor=C_MID,
fontName="Helvetica-Oblique", alignment=TA_CENTER, spaceAfter=6)
sTip = S("sTip",
fontSize=9.5, leading=13, textColor=colors.HexColor("#1a5276"),
fontName="Helvetica-Bold", spaceAfter=3)
# ─── HELPER BUILDERS ──────────────────────────────────────────────────────────
def section_header(title, color):
"""Full-width coloured section banner."""
data = [[Paragraph(title, sH1)]]
t = Table(data, colWidths=[W - 30*mm])
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), 14),
("RIGHTPADDING",(0,0), (-1,-1), 14),
("ROUNDEDCORNERS", (0,0), (-1,-1), 6),
]))
return t
def info_box(title, body_paragraphs, color_lt, color_dk):
"""Coloured info box."""
content = [Paragraph(f"<b>{title}</b>", ParagraphStyle("bh",
fontSize=10, leading=13, textColor=color_dk, fontName="Helvetica-Bold",
spaceAfter=4))]
for p in body_paragraphs:
content.append(Paragraph(p, sBody))
data = [[content]]
t = Table(data, colWidths=[W - 30*mm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), color_lt),
("BOX", (0,0), (-1,-1), 1, color_dk),
("TOPPADDING", (0,0), (-1,-1), 8),
("BOTTOMPADDING",(0,0),(-1,-1),8),
("LEFTPADDING",(0,0), (-1,-1), 12),
("RIGHTPADDING",(0,0),(-1,-1), 12),
]))
return t
def mnemonic_box(letter_word, expansion_lines, tip=""):
"""Golden mnemonic box."""
rows = [[Paragraph(f'<font color="#d4ac0d">★</font> MNEMONIC: {letter_word}', sMnemonic)]]
for line in expansion_lines:
rows.append([Paragraph(line, sMnemonicBody)])
if tip:
rows.append([Paragraph(f"<i>{tip}</i>", sMnemonicBody)])
t = Table(rows, colWidths=[W - 30*mm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), C_GOLD_LT),
("BOX", (0,0), (-1,-1), 1.5, C_GOLD),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING",(0,0),(-1,-1),5),
("LEFTPADDING",(0,0), (-1,-1), 10),
("RIGHTPADDING",(0,0),(-1,-1), 10),
]))
return t
def two_col_table(headers, rows, col_colors=None):
"""Generic two-column table."""
data = [headers] + rows
n = len(headers)
cw = [(W - 30*mm) / n] * n
t = Table(data, colWidths=cw, repeatRows=1)
style = [
("BACKGROUND", (0,0), (-1,0), C_DARK),
("TEXTCOLOR", (0,0), (-1,0), C_WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 9),
("LEADING", (0,0), (-1,-1), 12),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 7),
("ROWBACKGROUNDS",(0,1), (-1,-1), [C_WHITE, C_LIGHT]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#bfc9ca")),
("VALIGN", (0,0), (-1,-1), "TOP"),
]
t.setStyle(TableStyle(style))
return t
def safe_img(path, width=None, height=None):
if not os.path.exists(path):
return Spacer(1, 1)
img = Image(path)
iw, ih = img.imageWidth, img.imageHeight
if width and not height:
height = ih * (width / iw)
elif height and not width:
width = iw * (height / ih)
img.drawWidth = width or iw
img.drawHeight = height or ih
return img
def tip_box(text):
data = [[Paragraph(f"💡 <b>Exam Tip:</b> {text}", sTip)]]
t = Table(data, colWidths=[W - 30*mm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), colors.HexColor("#eaf4fc")),
("BOX", (0,0),(-1,-1), 1, C_EAR),
("TOPPADDING", (0,0),(-1,-1), 6),
("BOTTOMPADDING",(0,0),(-1,-1),6),
("LEFTPADDING",(0,0),(-1,-1), 10),
]))
return t
# ─── DOCUMENT ELEMENTS ────────────────────────────────────────────────────────
story = []
add = story.append
# ══════════════════════════════════════════════════════════════════════════════
# COVER PAGE
# ══════════════════════════════════════════════════════════════════════════════
cover_rows = [[
Paragraph("ENT ANATOMY", sTitle),
], [
Paragraph("Complete Study Guide for MBBS", sSubTitle),
], [
Paragraph("EAR • NOSE • THROAT", sSubTitle),
], [
Paragraph("With Diagrams · Theory · Mnemonics · Summary Charts", sSubTitle),
]]
cover = Table(cover_rows, colWidths=[W - 30*mm])
cover.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), C_HEADER_BG),
("TOPPADDING", (0,0), (-1,-1), 18),
("BOTTOMPADDING", (0,0), (-1,-1), 14),
("LEFTPADDING", (0,0), (-1,-1), 20),
("RIGHTPADDING", (0,0), (-1,-1), 20),
("ROUNDEDCORNERS",(0,0), (-1,-1), 8),
]))
add(Spacer(1, 50))
add(cover)
add(Spacer(1, 20))
# Quick index card
idx_data = [
[Paragraph("<b>SECTION</b>", sBody), Paragraph("<b>TOPIC</b>", sBody), Paragraph("<b>PAGE</b>", sBody)],
[Paragraph("<font color='#1a6fa8'>1 — EAR</font>", sBody), Paragraph("External · Middle · Inner Ear; Ossicles; Blood & Nerve Supply", sBody), Paragraph("2", sBody)],
[Paragraph("<font color='#1e8449'>2 — NOSE</font>", sBody), Paragraph("Nasal Cavity · Septum · Turbinates · Paranasal Sinuses", sBody), Paragraph("6", sBody)],
[Paragraph("<font color='#a93226'>3 — THROAT</font>", sBody), Paragraph("Pharynx · Larynx · Tonsils · Vocal Cords", sBody), Paragraph("10", sBody)],
[Paragraph("<font color='#d4ac0d'>4 — MEMORY</font>", sBody), Paragraph("Mnemonics · Summary Charts · Quick Recall Tables", sBody), Paragraph("15", sBody)],
]
idx_t = Table(idx_data, colWidths=[45*mm, 105*mm, 15*mm])
idx_t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), C_DARK),
("TEXTCOLOR", (0,0), (-1,0), C_WHITE),
("FONTSIZE", (0,0), (-1,-1), 9),
("LEADING", (0,0), (-1,-1), 13),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 8),
("ROWBACKGROUNDS",(0,1), (-1,-1), [C_WHITE, C_LIGHT]),
("GRID", (0,0), (-1,-1), 0.4, C_MID),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
add(idx_t)
add(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 1 — EAR
# ══════════════════════════════════════════════════════════════════════════════
add(section_header("SECTION 1 — EAR ANATOMY", C_EAR))
add(Spacer(1, 8))
# Overview image
add(safe_img(os.path.join(IMG_DIR, "ent_fig_airway_overview.png"), width=W-34*mm))
add(Paragraph("Fig 1.1 — Overview of ENT anatomy: nasal cavities, pharynx, larynx and trachea (Gray's Anatomy for Students)", sCaption))
add(Spacer(1, 8))
# 1.1 External Ear
add(Paragraph("1.1 External Ear", sH2))
add(Paragraph(
"The external ear consists of two parts: the <b>auricle (pinna)</b> and the "
"<b>external auditory canal (EAC)</b>. Together they collect and funnel sound "
"waves toward the tympanic membrane.", sBody))
ear_ext = two_col_table(
["STRUCTURE", "KEY FACTS"],
[
["Auricle (Pinna)",
"Elastic cartilage covered by keratinising squamous epithelium. Perichondrium tightly bound on lateral side, loosely on medial side. Lobule has no cartilage (only fat)."],
["External Auditory Canal (EAC)",
"~2.5 cm long in adults. Lateral 1/3 = cartilaginous (contains hair follicles, sebaceous & apocrine glands). Medial 2/3 = bony (tympanic portion of temporal bone)."],
["Cerumen (Earwax)",
"Formed by glandular secretions + sloughed epithelium in cartilaginous EAC. Hydrophobic, slightly acidic (pH 6.0–6.5). Self-cleaning: epithelium migrates centrifugally outward."],
["Isthmus",
"Junction of bony & cartilaginous canal = narrowest point of EAC. Important in otoscopy."],
["Fissures of Santorini",
"Transverse slits in cartilaginous EAC — allow spread of infection/tumour to surrounding soft tissue."],
["Foramen of Huschke",
"Defect in anterior bony canal (incomplete ossification) — allows spread of parotid disease or vice versa."],
]
)
add(ear_ext)
add(Spacer(1, 8))
add(mnemonic_box("AURICLE Parts — 'Some Tall Cows Have Lots of Lovely Ear Tissue'",
["<b>S</b>caphoid fossa <b>T</b>ragus <b>C</b>oncha <b>H</b>elix",
"<b>L</b>obule <b>A</b>ntitragus <b>E</b>ar canal <b>T</b>riangular fossa"],
"Visualise the ear and point to each part as you say the word."))
add(Spacer(1, 8))
# 1.2 Tympanic Membrane
add(Paragraph("1.2 Tympanic Membrane (TM)", sH2))
add(info_box("Structure of the TM", [
"<b>Pars tensa</b> (larger inferior portion): 3 layers — outer squamous epithelium, middle fibrous layer (circular & radial fibres), inner mucosal layer.",
"<b>Pars flaccida (Shrapnell's membrane)</b>: small superior portion above malleolar folds; lacks middle fibrous layer — hence 'flaccid'. Most common site for <b>cholesteatoma</b>.",
"<b>Umbo</b>: the most depressed central point where the handle of malleus attaches.",
"<b>Cone of light</b>: a triangular light reflex seen at 5 o'clock (right ear) / 7 o'clock (left ear) on otoscopy — formed by reflection of light off TM.",
"<b>Annulus</b>: thickened fibrocartilaginous ring anchoring TM to bony canal.",
], C_EAR_LT, C_EAR))
add(Spacer(1, 8))
add(tip_box("If pars flaccida is perforated or retracted → suspect UNSAFE CSOM (cholesteatoma). If pars tensa perforated → SAFE CSOM."))
add(Spacer(1, 8))
# 1.3 Middle Ear
add(Paragraph("1.3 Middle Ear (Tympanic Cavity)", sH2))
add(Paragraph(
"The middle ear is an air-filled space within the temporal bone. It contains the "
"<b>three ossicles</b>, the <b>eustachian tube</b> opening, and the <b>facial nerve</b> "
"(VII). It is divided into three parts:", sBody))
me_parts = two_col_table(
["PART", "LOCATION & CONTENTS"],
[
["Epitympanum (Attic)", "Superior to TM. Contains head of malleus + body of incus. Common site for cholesteatoma."],
["Mesotympanum", "Level of TM. Contains all ossicles, oval & round windows, facial nerve (horizontal segment)."],
["Hypotympanum", "Below TM. Floor overlies jugular bulb (clinically important — high jugular bulb)."],
]
)
add(me_parts)
add(Spacer(1, 8))
add(Paragraph("1.3.1 The Ossicular Chain", sH3))
ossicles = two_col_table(
["OSSICLE", "SHAPE / DESCRIPTION", "CONNECTIONS", "CLINICAL NOTE"],
[
["Malleus (Hammer)", "Largest ossicle. Handle (manubrium) embedded in TM.", "Head articulates with incus body (incudomalleolar joint)", "Manubrium visible on otoscopy as pale streak"],
["Incus (Anvil)", "Body + long process + short process (lenticular process)", "Long process articulates with stapes head (incudostapedial joint)", "MOST VULNERABLE part = long process (single nutrient vessel, no collateral circulation)"],
["Stapes (Stirrup)", "Smallest bone in body. Head + two crura + footplate", "Footplate sits in oval window", "Footplate fixation → otosclerosis → conductive hearing loss"],
]
)
add(ossicles)
add(Spacer(1, 8))
add(mnemonic_box("Order of Ossicles — 'MIS'",
["<b>M</b>alleus → <b>I</b>ncus → <b>S</b>tapes",
"Sound enters → Malleus vibrates → Incus moves → Stapes pushes oval window → inner ear"],
"Think: MIS-take not to remember this!"))
add(Spacer(1, 8))
add(Paragraph("1.3.2 Muscles of Middle Ear", sH3))
me_musc = two_col_table(
["MUSCLE", "NERVE", "ACTION", "MNEMONIC"],
[
["Tensor tympani", "Medial pterygoid nerve (V3 — trigeminal)", "Pulls malleus medially — dampens vibration", "Tensor = Trigeminal (T=T)"],
["Stapedius", "Facial nerve (CN VII)", "Pulls stapes posteriorly — acoustic reflex (protects inner ear)", "Stapedius = Seven (S=S)"],
]
)
add(me_musc)
add(Spacer(1, 8))
add(tip_box("Stapedius reflex is tested in tympanometry (Type A tympanogram = normal). Loss of stapedius reflex = early sign of facial nerve palsy."))
add(Spacer(1, 8))
# 1.4 Eustachian Tube
add(Paragraph("1.4 Eustachian Tube (Pharyngotympanic Tube)", sH2))
add(info_box("Eustachian Tube — Key Facts", [
"Length: ~35–40 mm. Runs from middle ear → nasopharynx at angle of 45° in adults, ~10° in children (more horizontal → children more prone to middle ear infections).",
"Medial 2/3 = cartilaginous (normally closed). Lateral 1/3 = bony (always open).",
"<b>Function:</b> ventilation and pressure equalisation of middle ear; drainage of middle ear secretions.",
"<b>Levator veli palatini</b> and <b>tensor veli palatini</b> open the tube during swallowing/yawning.",
"Isthmus = narrowest point at junction of bony and cartilaginous portions.",
"<b>Clinical:</b> Eustachian tube dysfunction → otitis media with effusion (glue ear) in children.",
], C_EAR_LT, C_EAR))
add(Spacer(1, 8))
# 1.5 Inner Ear
add(Paragraph("1.5 Inner Ear (Labyrinth)", sH2))
add(Paragraph(
"The inner ear is housed in the <b>petrous temporal bone</b> and consists of two "
"functional compartments: the <b>cochlea</b> (hearing) and the "
"<b>vestibular apparatus</b> (balance).", sBody))
inner = two_col_table(
["STRUCTURE", "FUNCTION & KEY DETAILS"],
[
["Cochlea", "2¾ turns. Divided into: scala vestibuli (perilymph), scala media/cochlear duct (endolymph), scala tympani (perilymph). Organ of Corti sits on basilar membrane inside scala media — contains inner & outer hair cells."],
["Basilar Membrane", "Tonotopic: high freq at base (near oval window), low freq at apex. Remember: BASE = BASS (low notes come from bass guitar but the base of cochlea processes HIGH freq — common exam trap!)."],
["Organ of Corti", "Sensory organ of hearing. 1 row inner hair cells (IHC) + 3 rows outer hair cells (OHC). IHC = primary sensory; OHC = amplification."],
["Vestibule", "Contains utricle & saccule. Detects linear acceleration and gravity (static equilibrium)."],
["Semicircular Canals (3)", "Lateral, Superior, Posterior. Detect angular/rotational acceleration. Each ends in an ampulla (contains crista ampullaris with hair cells + cupula)."],
["Endolymph vs Perilymph", "Endolymph (K⁺-rich, like intracellular fluid) fills scala media, utricle, saccule, SCC. Perilymph (Na⁺-rich, like CSF) fills scala vestibuli & tympani."],
]
)
add(inner)
add(Spacer(1, 8))
add(mnemonic_box("Three Scalae of Cochlea — 'Vest, Med, Tymp'",
["<b>V</b>estibuli (top) — perilymph",
"<b>M</b>edia (middle) — endolymph (Reissner's membrane above, basilar membrane below)",
"<b>T</b>ympani (bottom) — perilymph"],
"VMT = Very Musical Tones!"))
add(Spacer(1, 8))
# 1.6 Blood & Nerve Supply — Ear
add(Paragraph("1.6 Blood Supply & Nerve Supply of the Ear", sH2))
ear_ns = two_col_table(
["REGION", "ARTERY", "NERVE (Sensory)"],
[
["Auricle (anterior)", "Superficial temporal artery (ECA branch)", "Auriculotemporal nerve (V3)"],
["Auricle (posterior)", "Posterior auricular artery (ECA branch)", "Great auricular nerve (C2, C3)"],
["EAC & TM (outer)", "Deep auricular artery (maxillary art.)", "Auriculotemporal (V3) + Arnold's nerve (vagus X) — triggers cough reflex"],
["Middle Ear", "Anterior tympanic (maxillary), Stylomastoid (post. auricular)", "Tympanic plexus (Jacobson's nerve — IX branch)"],
["Inner Ear", "Labyrinthine artery (from AICA / basilar artery)", "Vestibulocochlear nerve (CN VIII)"],
]
)
add(ear_ns)
add(Spacer(1, 8))
add(tip_box("Arnold's nerve (auricular branch of vagus X) in EAC → stimulation causes cough reflex. This is why ear syringing or cerumen removal sometimes triggers coughing."))
add(Spacer(1, 10))
add(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 2 — NOSE
# ══════════════════════════════════════════════════════════════════════════════
add(section_header("SECTION 2 — NOSE & PARANASAL SINUSES", C_NOSE))
add(Spacer(1, 8))
# 2.1 External Nose
add(Paragraph("2.1 External Nose", sH2))
add(info_box("Skeleton of the External Nose", [
"<b>Upper 1/3</b>: paired nasal bones (articulate with frontal bone superiorly — nasofrontal suture).",
"<b>Middle 1/3</b>: upper lateral cartilages (ULC) attached to nasal bones superiorly, to septal cartilage medially.",
"<b>Lower 1/3</b>: lower lateral cartilages (LLC / alar cartilages) — medial crura form the columella, lateral crura form the ala.",
"<b>Keystone area</b>: junction of nasal bones + ULC — critical in rhinoplasty; disruption causes saddle-nose deformity.",
], C_NOSE_LT, C_NOSE))
add(Spacer(1, 8))
# 2.2 Nasal Cavity
add(Paragraph("2.2 Nasal Cavity", sH2))
add(Paragraph(
"The nasal cavity extends from the <b>external nares</b> anteriorly to the "
"<b>posterior choanae</b> posteriorly (where it opens into the nasopharynx). "
"It is divided into two passages by the nasal septum.", sBody))
nc_walls = two_col_table(
["WALL", "FORMED BY"],
[
["Floor", "Anterior 3/4: palatine process of maxilla. Posterior 1/4: horizontal plate of palatine bone."],
["Roof", "Nasal bones (ant.) → cribriform plate of ethmoid (middle) → body of sphenoid (post.). Slopes downward ant.→post. (important in FESS!)."],
["Medial wall (Septum)", "Bony: perpendicular plate of ethmoid (upper) + vomer (lower). Cartilaginous: quadrilateral (septal) cartilage (ant.)."],
["Lateral wall", "Most complex wall. Contains turbinates + sinus drainage openings. (See 2.3)"],
]
)
add(nc_walls)
add(Spacer(1, 8))
add(mnemonic_box("Nasal Septum Components — 'PEV Cartilage'",
["<b>P</b>erpendicular plate of ethmoid (upper posterior bony)",
"<b>E</b>thmoid (the above — just a reminder)",
"<b>V</b>omer (lower bony)",
"<b>Cartilage</b> (anterior quadrilateral septal cartilage)"],
"PEV = Perpendicular-Ethmoid-Vomer. Septal deviations commonly occur at junctions."))
add(Spacer(1, 8))
# 2.3 Lateral Wall & Turbinates
add(Paragraph("2.3 Lateral Wall — Turbinates (Conchae) & Meatuses", sH2))
add(Paragraph(
"The lateral wall has 3 turbinates (superior, middle, inferior). Each turbinate "
"overhangs a corresponding meatus — the space through which sinuses drain.", sBody))
turb = two_col_table(
["TURBINATE", "MEATUS BELOW", "WHAT DRAINS HERE"],
[
["Superior turbinate", "Superior meatus", "Posterior ethmoidal air cells. Also sphenoethmoidal recess (above superior turbinate) drains sphenoid sinus."],
["Middle turbinate", "Middle meatus", "MOST DRAINS HERE: Frontal, maxillary, anterior ethmoidal sinuses drain via the ostiomeatal complex (OMC)."],
["Inferior turbinate", "Inferior meatus", "Nasolacrimal duct (tears → nose → explains why you get runny nose when crying)."],
]
)
add(turb)
add(Spacer(1, 8))
add(mnemonic_box("Drainage — 'SMS / SIM'",
["<b>S</b>uperior meatus → <b>S</b>phenoethmoidal recess drains <b>S</b>phenoid + posterior ethmoids",
"<b>M</b>iddle meatus → <b>M</b>axillary + anterior ethmoid + <b>F</b>rontal (via infundibulum)",
"<b>I</b>nferior meatus → <b>N</b>asolacrimal duct"],
"Remember: Middle meatus = Maximum drainage site — most sinuses drain here!"))
add(Spacer(1, 8))
add(info_box("Ostiomeatal Complex (OMC)", [
"The OMC is the final common pathway for drainage of frontal, maxillary, and anterior ethmoidal sinuses into the middle meatus.",
"Key components: maxillary sinus ostium → infundibulum → hiatus semilunaris → middle meatus.",
"<b>Clinical importance:</b> OMC obstruction (e.g. by mucosal oedema, polyps, septal deviation) → recurrent sinusitis. Target of FESS (functional endoscopic sinus surgery).",
], C_NOSE_LT, C_NOSE))
add(Spacer(1, 8))
# 2.4 Blood Supply of Nose
add(Paragraph("2.4 Blood Supply of the Nose", sH2))
add(Paragraph(
"The nose has a rich blood supply from <b>both ICA and ECA</b> systems — which is "
"why epistaxis is so common and can be severe.", sBody))
nasal_blood = two_col_table(
["ARTERY", "ORIGIN", "AREA SUPPLIED"],
[
["Anterior ethmoidal artery", "Ophthalmic artery (ICA)", "Anterior superior septum & lateral wall"],
["Posterior ethmoidal artery", "Ophthalmic artery (ICA)", "Posterior superior septum"],
["Sphenopalatine artery", "Maxillary artery (ECA) — main supply", "Posterior septum & lateral wall (posteroinferior)"],
["Greater palatine artery", "Maxillary artery (ECA)", "Inferior septum anteriorly"],
["Superior labial artery", "Facial artery (ECA)", "Anterior septum (Little's area)"],
]
)
add(nasal_blood)
add(Spacer(1, 8))
add(info_box("Little's Area (Kiesselbach's Plexus)", [
"Located on the <b>anteroinferior nasal septum</b>. Site of anastomosis of 5 arteries: anterior ethmoidal, posterior ethmoidal, sphenopalatine, greater palatine, and superior labial arteries.",
"<b>Most common site of epistaxis</b> (~90% of nosebleeds) — anterior epistaxis. Easily visualised and cauterised.",
"Woodruff's plexus = posterior lateral wall — site of posterior epistaxis (more severe, requires nasal packing or endoscopic ligation of sphenopalatine artery).",
], C_NOSE_LT, C_NOSE))
add(Spacer(1, 8))
add(mnemonic_box("Kiesselbach's Plexus — '5 arteries — ASGLS'",
["<b>A</b>nterior ethmoidal",
"<b>S</b>phenopalatine",
"<b>G</b>reater palatine",
"<b>L</b>abial superior",
"<b>S</b>eptal branch (from facial art.)"],
"Remember: All these meet at Little's area on the anterior septum!"))
add(Spacer(1, 8))
# 2.5 Nerve Supply of Nose
add(Paragraph("2.5 Nerve Supply of the Nasal Cavity", sH2))
add(info_box("Innervation", [
"<b>Olfactory nerve (CN I)</b>: olfactory epithelium — superior septum, superior turbinate, upper middle turbinate. Fibres pass through cribriform plate.",
"<b>Sensory:</b> ophthalmic (V1) — anterior septum & lateral wall via anterior ethmoidal nerve. Maxillary (V2) — posterior septum & lateral wall via posterolateral nasal branches from sphenopalatine ganglion.",
"<b>Autonomic:</b> Parasympathetic (greater superficial petrosal nerve → vidian nerve → sphenopalatine ganglion) → regulates nasal secretions. Sympathetic (deep petrosal nerve → vidian nerve) → regulates vascular tone and turbinate congestion.",
"<b>Sphenopalatine ganglion</b>: 'ganglion of hay fever' — postganglionic parasympathetic fibres from here innervate nasal glands. Target for vidian neurectomy in vasomotor rhinitis.",
], C_NOSE_LT, C_NOSE))
add(Spacer(1, 8))
# 2.6 Paranasal Sinuses
add(Paragraph("2.6 Paranasal Sinuses", sH2))
sinuses = two_col_table(
["SINUS", "DEVELOPMENT", "DRAINAGE", "RELATIONS / CLINICAL"],
[
["Maxillary sinus\n(Antrum of Highmore)",
"Present at birth. Largest paranasal sinus. Fully developed by age 18.",
"Ostium opens into middle meatus (infundibulum). High position of ostium → poor gravity drainage (important clinically!)",
"Floor = alveolar process (upper molar roots may project into sinus). Roof = orbital floor. Posterior wall: pterygomaxillary fissure. Infraorbital nerve runs in roof."],
["Frontal sinus",
"Absent at birth. Appears ~2 yrs, fully formed by puberty.",
"Nasofrontal duct → middle meatus via infundibulum",
"Intracranial complications of sinusitis (meningitis, abscess) most common from frontal sinus. Pott's puffy tumour = subperiosteal abscess of forehead."],
["Ethmoid sinuses",
"Present at birth as small air cells. Most complex anatomy.",
"Anterior cells → middle meatus. Posterior cells → superior meatus.",
"Medial wall = lateral wall of nasal cavity (lamina papyracea = paper-thin orbital wall — easily breached in trauma)."],
["Sphenoid sinus",
"Appears ~3 yrs post birth. Fully developed by puberty.",
"Sphenoethmoidal recess (above superior turbinate)",
"Relations: optic nerve (lateral wall), pituitary gland (roof), carotid artery (lateral wall), cavernous sinus. Very important surgically (transsphenoidal hypophysectomy)."],
]
)
add(sinuses)
add(Spacer(1, 8))
add(mnemonic_box("Order of Sinus Development (by appearance) — 'Max Every Single Frontal'",
["<b>Max</b>illary sinus — present at birth",
"<b>E</b>thmoid sinus — present at birth",
"<b>S</b>phenoid — appears ~3 years",
"<b>F</b>rontal — appears ~2 years (fully formed puberty)"],
"Note: Maxillary + Ethmoid present at birth. Frontal + Sphenoid develop later."))
add(Spacer(1, 8))
add(tip_box("Sphenoid sinus is the most dangerous sinus to operate on — pituitary, optic nerve, carotid artery, and cavernous sinus are all adjacent."))
add(Spacer(1, 8))
add(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 3 — THROAT
# ══════════════════════════════════════════════════════════════════════════════
add(section_header("SECTION 3 — THROAT ANATOMY (Pharynx, Larynx & Tonsils)", C_THROAT))
add(Spacer(1, 8))
# Sagittal image
add(safe_img(os.path.join(IMG_DIR, "ent_fig1_sagittal.png"), width=W-34*mm))
add(Paragraph(
"Fig 3.1 — Sagittal section of head: nasal cavity, oral cavity, pharynx & larynx. "
"Note: oropharynx (uvula → hyoid), hypopharynx (hyoid → cricoid), and the "
"anterior position of trachea relative to oesophagus. (Miller's Anesthesia, 10e)", sCaption))
add(Spacer(1, 8))
# 3.1 Pharynx
add(Paragraph("3.1 Pharynx", sH2))
add(Paragraph(
"The pharynx is a <b>muscular fibrous tube</b> ~12 cm long, extending from the "
"base of skull to the lower border of the <b>cricoid cartilage (C6)</b>, where it "
"becomes the oesophagus. It lies posterior to the nasal, oral and laryngeal cavities.", sBody))
pharynx_parts = two_col_table(
["PART", "VERTICAL EXTENT", "ANTERIOR OPENING", "KEY STRUCTURES"],
[
["Nasopharynx", "Base of skull → soft palate (C1–C2 level)", "Posterior choanae (nasal cavity opens here)", "Eustachian tube opening (Fossa of Rosenmuller posterior to it). Adenoids (pharyngeal tonsil). Salpingopharyngeal fold."],
["Oropharynx", "Soft palate → upper border of epiglottis / hyoid bone (C2–C3 level)", "Oral cavity via oropharyngeal isthmus", "Palatine tonsils (in tonsillar fossa), posterior pharyngeal wall, base of tongue (lingual tonsil), vallecula."],
["Laryngopharynx (Hypopharynx)", "Hyoid bone → lower border of cricoid C6", "Laryngeal inlet (aditus laryngis)", "Pyriform fossae (lateral to larynx — foreign bodies lodge here). Posterior cricoid region. Cricopharyngeus (upper oesophageal sphincter)."],
]
)
add(pharynx_parts)
add(Spacer(1, 8))
add(mnemonic_box("Pharynx Divisions — 'NaO Hy-La Cri'",
["<b>Na</b>sopharynx: skull base → soft palate",
"<b>O</b>ro: soft palate → <b>Hy</b>oid",
"<b>La</b>ryngopharynx: hyoid → <b>Cri</b>coid"],
"Vertical boundaries: Base → Soft palate → Hyoid → Cricoid"))
add(Spacer(1, 8))
# Pharyngeal muscles
add(Paragraph("3.1.1 Muscles of the Pharynx", sH3))
pharynx_musc = two_col_table(
["MUSCLE GROUP", "MUSCLES", "NERVE", "ACTION"],
[
["Constrictors (outer)", "Superior, Middle, Inferior pharyngeal constrictors", "Vagus (CN X) via pharyngeal plexus", "Propel food bolus downward — peristalsis of pharynx"],
["Longitudinal (inner)", "Stylopharyngeus, Salpingopharyngeus, Palatopharyngeus", "Stylopharyngeus = CN IX (only muscle!). Others = CN X", "Elevate pharynx & larynx during swallowing"],
]
)
add(pharynx_musc)
add(Spacer(1, 6))
add(tip_box("Stylopharyngeus = only pharyngeal muscle supplied by glossopharyngeal nerve (CN IX). All others = vagus (CN X). This is a favourite MCQ!"))
add(Spacer(1, 8))
# Killian's dehiscence
add(info_box("Killian's Dehiscence — Pharyngeal (Zenker's) Diverticulum", [
"A triangular area of weakness in the posterior pharyngeal wall between the <b>thyropharyngeus</b> (oblique fibres of inferior constrictor) and <b>cricopharyngeus</b> (horizontal fibres of inferior constrictor).",
"Increased intraluminal pressure → mucosal herniation through this gap → forms a pulsion diverticulum (Zenker's diverticulum).",
"<b>Presentation:</b> dysphagia, regurgitation of undigested food, halitosis, gurgling sounds.",
"<b>Treatment:</b> endoscopic stapling of cricopharyngeal bar or external diverticulopexy.",
], C_THROAT_LT, C_THROAT))
add(Spacer(1, 8))
# 3.2 Tonsils
add(Paragraph("3.2 Waldeyer's Ring — Tonsillar Tissue", sH2))
tonsils = two_col_table(
["TONSIL", "LOCATION", "TYPE", "CLINICAL NOTE"],
[
["Pharyngeal tonsil (Adenoids)", "Roof & posterior wall of nasopharynx", "Lymphoid (no crypts)", "Enlargement → nasal obstruction, glue ear (blocks Eustachian tube), snoring."],
["Tubal tonsils (×2)", "Around Eustachian tube opening in nasopharynx", "Lymphoid", "Part of Waldeyer's ring. Less clinically significant."],
["Palatine tonsils (×2)", "Tonsillar fossa between palatoglossal (anterior pillar) and palatopharyngeal (posterior pillar) folds", "Cryptic lymphoid tissue", "Most commonly infected (tonsillitis). Peritonsillar abscess (quinsy) forms between tonsil & superior constrictor. Lingual nerve & glossopharyngeal nerve pass lateral to tonsil."],
["Lingual tonsil", "Base of tongue", "Lymphoid", "Hypertrophy can cause snoring, dysphagia, difficult intubation."],
]
)
add(tonsils)
add(Spacer(1, 8))
add(mnemonic_box("Waldeyer's Ring — 'The Ring of P-T-T-L'",
["<b>P</b>haryngeal (adenoid) — 1",
"<b>T</b>ubal — 2 (one each side)",
"<b>T</b>onsillar (palatine) — 2 (one each side)",
"<b>L</b>ingual — 1"],
"Total 6 tonsils form the ring. The ring guards the entrance to the aerodigestive tract!"))
add(Spacer(1, 8))
add(info_box("Peritonsillar Abscess (Quinsy)", [
"Collection of pus between the palatine tonsil capsule and the superior constrictor muscle.",
"<b>Presentation:</b> severe sore throat, drooling, trismus (spasm of pterygoid muscles), hot-potato voice, uvula displaced to opposite side, bulging of anterior pillar.",
"<b>Treatment:</b> incision & drainage or needle aspiration + IV antibiotics. Interval tonsillectomy after 6 weeks.",
], C_THROAT_LT, C_THROAT))
add(Spacer(1, 8))
# 3.3 Larynx
add(Paragraph("3.3 Larynx", sH2))
add(Paragraph(
"The larynx is the organ of phonation and the guardian of the lower airway. "
"It extends from the tip of epiglottis (<b>C3</b>) to the lower border of cricoid "
"cartilage (<b>C6</b>). It is suspended from the hyoid bone above by ligaments.", sBody))
add(safe_img(os.path.join(IMG_DIR, "ent_fig3_larynx_nerves.png"), width=W-60*mm))
add(Paragraph(
"Fig 3.3 — Laryngeal nerve supply: recurrent laryngeal nerve (motor to all intrinsic "
"muscles except cricothyroid) and superior laryngeal nerve (internal branch = sensory above "
"cords; external branch = motor to cricothyroid & inferior pharyngeal constrictor). "
"(Miller's Anesthesia, 10e)", sCaption))
add(Spacer(1, 8))
# Cartilages
add(Paragraph("3.3.1 Cartilages of the Larynx", sH3))
add(Paragraph("There are <b>9 cartilages</b>: 3 unpaired (single) + 3 paired.", sBody))
cartilages = two_col_table(
["CARTILAGE", "TYPE", "DESCRIPTION & CLINICAL RELEVANCE"],
[
["Thyroid (unpaired)", "Hyaline", "Largest cartilage. Shield-shaped. Laryngeal prominence ('Adam's apple'). Superior & inferior cornua. Superior cornu — landmark for superior laryngeal nerve block."],
["Cricoid (unpaired)", "Hyaline — Only COMPLETE ring in airway", "Signet-ring shape. Widest part posterior. Level C6. Sellick maneuver: press posteriorly to occlude oesophagus and prevent aspiration."],
["Epiglottis (unpaired)", "Elastic", "Leaf-shaped. Attached to posterior surface of thyroid cartilage via thyroepiglottic ligament. Covers laryngeal inlet during swallowing. Vallecula = space between epiglottis and base of tongue."],
["Arytenoids (paired ×2)", "Hyaline", "Pyramid-shaped. Vocal processes (attached to vocal cords). Muscular processes (intrinsic muscle attachments). Adduction/abduction of vocal cords depends on arytenoid movement."],
["Corniculate (×2)", "Elastic", "Sit on apex of arytenoids. Form part of aryepiglottic fold."],
["Cuneiform (×2)", "Elastic", "Within aryepiglottic folds. Stiffen the fold."],
]
)
add(cartilages)
add(Spacer(1, 8))
add(mnemonic_box("9 Laryngeal Cartilages — 'The Cricoid Epiglottis Tyrant Adores Carving Cuneiform'",
["<b>T</b>hyroid (1), <b>C</b>ricoid (1), <b>E</b>piglottis (1) — unpaired (3 total)",
"<b>A</b>rytenoid (2), <b>C</b>orniculate (2), <b>C</b>uneiform (2) — paired (6 total)"],
"3 unpaired + 3 paired = 9 cartilages total"))
add(Spacer(1, 8))
# Cavity of larynx
add(Paragraph("3.3.2 Divisions of the Laryngeal Cavity", sH3))
larynx_cav = two_col_table(
["DIVISION", "EXTENT", "FOLDS / STRUCTURES", "CLINICAL"],
[
["Supraglottis", "Laryngeal inlet → superior surface of vocal cords", "Aryepiglottic folds, false vocal cords (vestibular folds), ventricle (sinus of Morgagni)", "Supraglottic carcinoma — rich lymphatics → early nodal metastasis"],
["Glottis", "True vocal cords + anterior commissure + posterior interarytenoid area", "True vocal cords (vocalis muscle + vocal ligament + mucosa). Rima glottidis = opening between cords.", "Most common site of laryngeal carcinoma. Poor lymphatics → late metastasis."],
["Subglottis", "5 mm below vocal cord apex (anteriorly) to lower border of cricoid", "No named structures — trachea begins here", "Subglottic stenosis. Narrowest part of larynx in children = subglottis (cricoid ring)."],
]
)
add(larynx_cav)
add(Spacer(1, 6))
add(tip_box("In adults, narrowest part of larynx = rima glottidis. In children, narrowest part = subglottis (cricoid ring) — that is why croup causes subglottic narrowing and 'steeple sign' on X-ray."))
add(Spacer(1, 8))
# Intrinsic muscles
add(Paragraph("3.3.3 Intrinsic Muscles of the Larynx", sH3))
add(Paragraph(
"All intrinsic muscles are supplied by the <b>recurrent laryngeal nerve (RLN)</b> "
"EXCEPT the <b>cricothyroid</b>, which is supplied by the external branch of the "
"<b>superior laryngeal nerve (SLN)</b>.", sBody))
intrinsic = two_col_table(
["MUSCLE", "ACTION", "NERVE"],
[
["Posterior cricoarytenoid (PCA)", "ONLY ABDUCTOR of vocal cords (opens glottis). Essential for breathing.", "RLN"],
["Lateral cricoarytenoid (LCA)", "Adductor — closes glottis (phonation, coughing)", "RLN"],
["Interarytenoid (transverse + oblique)", "Adductor — closes posterior glottis", "RLN (only bilateral RLN supply)"],
["Thyroarytenoid (vocalis)", "Shortens & relaxes vocal cords (lowers pitch)", "RLN"],
["Cricothyroid", "Elongates & tenses vocal cords (raises pitch). ONLY muscle supplied by external SLN.", "External branch of SLN"],
]
)
add(intrinsic)
add(Spacer(1, 8))
add(mnemonic_box("Abductor vs Adductor — 'PCA opens; all others close'",
["<b>P</b>osterior <b>C</b>ricoarytenoid = ONLY <b>A</b>bductor",
"Bilateral RLN palsy → both PCAs paralysed → both cords adducted → airway obstruction!",
"Unilateral RLN palsy → hoarseness (adduction on one side only)"],
"PCA = 'PAC-man that opens the mouth (glottis)'"))
add(Spacer(1, 8))
# Nerve supply of larynx
add(Paragraph("3.3.4 Nerve Supply of the Larynx", sH3))
larynx_ns = two_col_table(
["NERVE", "ORIGIN", "SENSORY", "MOTOR"],
[
["Internal branch of SLN", "Vagus (X) → Superior laryngeal nerve", "Supraglottis (mucosa above vocal cords), base of tongue, vallecula, piriform fossa", "None (purely sensory)"],
["External branch of SLN", "Vagus (X) → Superior laryngeal nerve", "Minimal", "Cricothyroid muscle + inferior pharyngeal constrictor"],
["Recurrent laryngeal nerve (RLN)", "Vagus (X). Right: loops under right subclavian. Left: loops under arch of aorta.", "Below vocal cords + upper trachea", "All intrinsic laryngeal muscles except cricothyroid"],
]
)
add(larynx_ns)
add(Spacer(1, 6))
add(tip_box("Left RLN has longer course (loops under aortic arch) → more vulnerable to damage by mediastinal masses, aortic aneurysm, lung cancer. Right RLN loops under right subclavian artery."))
add(Spacer(1, 8))
add(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 4 — MNEMONICS, SUMMARY CHARTS & QUICK RECALL
# ══════════════════════════════════════════════════════════════════════════════
add(section_header("SECTION 4 — MNEMONICS, SUMMARY CHARTS & QUICK RECALL", C_GOLD))
add(Spacer(1, 8))
# Master Summary: Cranial Nerves in ENT
add(Paragraph("4.1 Cranial Nerves in ENT — Master Table", sH2))
cn_ent = two_col_table(
["CN", "NAME", "ENT RELEVANCE"],
[
["I", "Olfactory", "Smell — fibres pass through cribriform plate to olfactory mucosa in nasal roof. Anosmia in cribriform plate fractures."],
["V1", "Ophthalmic (trigeminal)", "Anterior ethmoidal nerve → anterior nasal septum & lateral wall. Corneal reflex."],
["V2", "Maxillary (trigeminal)", "Posterior nasal septum, lateral wall, upper teeth, palate. Maxillary sinusitis pain referred here."],
["V3", "Mandibular (trigeminal)", "Auriculotemporal nerve → EAC, TM outer layer, auricle (anterior). Tensor tympani motor."],
["VII", "Facial", "Motor to all facial muscles, stapedius. Secretomotor to lacrimal + nasal glands (via greater petrosal). Chorda tympani = taste anterior 2/3 tongue + secretomotor to submandibular & sublingual glands."],
["VIII", "Vestibulocochlear", "Cochlear div = hearing. Vestibular div = balance. BPPV, Meniere's, acoustic neuroma."],
["IX", "Glossopharyngeal", "Taste posterior 1/3 tongue. Tympanic plexus (Jacobson's nerve) → middle ear sensory. Stylopharyngeus motor. Carotid sinus reflex."],
["X", "Vagus", "Arnold's nerve → EAC (triggers cough reflex). Pharyngeal motor via pharyngeal plexus. SLN + RLN → larynx. Palate elevation (with XI)."],
["XI", "Accessory", "Sternocleidomastoid + trapezius. Neck dissection — at risk."],
["XII", "Hypoglossal", "Tongue motor. At risk in floor of mouth surgery & neck dissection."],
]
)
add(cn_ent)
add(Spacer(1, 8))
# 4.2 Hearing Loss Quick Summary
add(Paragraph("4.2 Conductive vs Sensorineural Hearing Loss (SNHL)", sH2))
hl_table = two_col_table(
["FEATURE", "CONDUCTIVE HL", "SENSORINEURAL HL"],
[
["Lesion site", "External ear, TM, middle ear, ossicles, Eustachian tube", "Cochlea (sensory), auditory nerve (neural), central pathway"],
["Rinne test", "Negative (BC > AC — abnormal)", "Positive (AC > BC — normal but reduced overall)"],
["Weber test", "Lateralises to AFFECTED ear", "Lateralises to NORMAL (better) ear"],
["Common causes", "Wax, otitis media, CSOM, otosclerosis, TM perforation", "Presbycusis, noise-induced, Meniere's, acoustic neuroma, ototoxic drugs"],
["Max air-bone gap", "Up to 60 dB", "No air-bone gap"],
]
)
add(hl_table)
add(Spacer(1, 8))
add(mnemonic_box("Weber & Rinne Trick — 'Weber goes to the Bad ear in Conductive, Good ear in Nerve'",
["Conductive HL → Weber → <b>BAD</b> (affected) ear (bone conduction better, ambient noise masked)",
"SNHL → Weber → <b>GOOD</b> ear (cochlea in bad ear can't perceive even bone conduction)"],
"Ring-Tone for Rinne: if Rinne Negative → Conductive (BC beats AC). Positive (AC > BC) = Normal or SNHL."))
add(Spacer(1, 8))
# 4.3 Paranasal Sinus Chart
add(Paragraph("4.3 Paranasal Sinuses — At-a-Glance", sH2))
sinus_chart = two_col_table(
["SINUS", "PRESENT AT BIRTH?", "DRAINS INTO", "IMPORTANT RELATIONS"],
[
["Maxillary", "YES", "Middle meatus (infundibulum)", "Floor = upper molar teeth; Roof = orbit floor; Infraorbital nerve in roof"],
["Ethmoid", "YES (small)", "Anterior → middle meatus; Posterior → superior meatus", "Lamina papyracea = orbital wall (paper thin!)"],
["Frontal", "NO (~2 yrs)", "Middle meatus (nasofrontal duct)", "Intracranial complications; Pott's puffy tumour"],
["Sphenoid", "NO (~3 yrs)", "Sphenoethmoidal recess", "Pituitary, optic nerve, carotid, cavernous sinus"],
]
)
add(sinus_chart)
add(Spacer(1, 8))
# 4.4 Larynx Quick Facts
add(Paragraph("4.4 Larynx — Quick Reference Card", sH2))
larynx_quick = two_col_table(
["ITEM", "DETAIL"],
[
["Vertebral levels", "Tip of epiglottis = C3; Larynx = C3–C6; Lower border cricoid = C6 (beginning of trachea)"],
["Narrowest part", "Adults = rima glottidis; Children = subglottis (cricoid ring)"],
["Only abductor", "Posterior cricoarytenoid (PCA) muscle"],
["Supplied by external SLN", "Cricothyroid muscle only"],
["Cricothyroid membrane", "Between thyroid cartilage (above) and cricoid (below). Site of emergency cricothyrotomy."],
["Vallecula", "Depression between base of tongue and epiglottis. Foreign bodies & epiglottis tip visible here on laryngoscopy."],
["Ventricle (Sinus of Morgagni)", "Space between true and false vocal cords. Laryngocele forms here."],
["Rima glottidis", "Opening between vocal cords. Ant. 3/5 = intermembranous part (phonation). Post. 2/5 = intercartilaginous part (breathing)."],
]
)
add(larynx_quick)
add(Spacer(1, 8))
# 4.5 Master Mnemonic Summary
add(Paragraph("4.5 Master Mnemonic Collection", sH2))
mnemonics_data = [
["TOPIC", "MNEMONIC", "FULL FORM"],
["Ossicles in order", "MIS", "Malleus → Incus → Stapes"],
["Middle ear muscles & nerves", "T=T, S=S", "Tensor tympani = Trigeminal (V3); Stapedius = Seven (CN VII)"],
["Kiesselbach's arteries", "ASGLS", "Anterior ethmoidal, Sphenopalatine, Greater palatine, Labial superior, Septal"],
["Nasal septum bones", "PEV-C", "Perpendicular plate ethmoid, Ethmoid, Vomer, Cartilage (septal)"],
["Turbinate drainage", "Middle=Maximum", "Middle meatus drains most sinuses (max, frontal, ant. ethmoid)"],
["Sinus development", "Max+Eth at birth; Sphen 3y; Front 2y", "M-E-S-F order of appearance"],
["Pharynx boundaries", "Base→Soft palate→Hyoid→Cricoid", "Naso/Oro/Laryngopharynx"],
["Waldeyer's ring", "1 Pharyngeal + 2 Tubal + 2 Palatine + 1 Lingual = 6", "PTTL Ring"],
["Laryngeal cartilages", "3 unpaired (T,C,E) + 3 paired (A,Cn,Cu)", "Thyroid, Cricoid, Epiglottis; Arytenoid, Corniculate, Cuneiform"],
["Only laryngeal abductor", "PCA opens the gate", "Posterior Cricoarytenoid = only abductor"],
["Cricothyroid nerve", "Exception = External SLN", "All others = RLN"],
["Weber lateralisation", "Conductive→Bad ear; SNHL→Good ear", "Weber goes where hearing is better by bone conduction"],
]
mn_t = Table(mnemonics_data, colWidths=[45*mm, 50*mm, 70*mm])
mn_t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), C_GOLD),
("TEXTCOLOR", (0,0), (-1,0), C_DARK),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("LEADING", (0,0), (-1,-1), 12),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("ROWBACKGROUNDS",(0,1), (-1,-1), [C_GOLD_LT, C_WHITE]),
("GRID", (0,0), (-1,-1), 0.4, C_GOLD),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
add(mn_t)
add(Spacer(1, 8))
add(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 5 — CLINICAL CORRELATIONS & EXAM TIPS
# ══════════════════════════════════════════════════════════════════════════════
add(section_header("SECTION 5 — CLINICAL CORRELATIONS & HIGH-YIELD EXAM POINTS", C_DARK))
add(Spacer(1, 8))
clinical = [
["CONDITION", "ANATOMY BASIS", "EXAM PEARL"],
["Otosclerosis", "Stapes footplate fixation in oval window — sound transmission blocked", "Low-frequency conductive HL. Paracusis Willisi (hears better in noise). Flamingo-pink blush (Schwartze sign). Rx: Stapedectomy."],
["Cholesteatoma", "Epithelial ingrowth through pars flaccida (attic perforation) or retraction pocket", "Unsafe CSOM. Smelly, painless, persistent ear discharge. Bone erosion → facial palsy, labyrinthitis. Rx: Mastoid surgery."],
["Epistaxis (anterior)", "Kiesselbach's plexus on anteroinferior septum (Little's area)", "MC site. Rx: Pinch nose 10 min → silver nitrate cautery → BIPP packing if fails."],
["Epistaxis (posterior)", "Woodruff's plexus on posterior lateral wall. Sphenopalatine artery.", "Elderly, hypertensive. Requires posterior nasal packing or sphenopalatine artery ligation."],
["Epiglottitis", "Infection of supraglottic larynx (epiglottis), usually H. influenzae type b", "Child with high fever, drooling, tripod position, muffled voice. 'Thumb sign' on lateral neck X-ray. Emergency airway!"],
["Croup (LTB)", "Subglottic narrowing at cricoid level (narrowest in children)", "'Steeple sign' on AP neck X-ray. Barking cough. Rx: Dexamethasone + nebulised adrenaline."],
["Peritonsillar abscess", "Pus between tonsil capsule and superior constrictor", "Hot-potato voice, trismus, uvula displaced. Rx: I&D or needle aspiration."],
["Vocal cord palsy (unilateral)", "RLN damage → PCA paralysed on one side → cord adducted (paramedian)", "Hoarse voice. Bovine cough. Causes: thyroid surgery, lung cancer (L side), mediastinal mass."],
["Vocal cord palsy (bilateral)", "Both RLNs damaged → both PCAs paralysed → both cords in midline", "Stridor + respiratory distress. Voice may be near normal! Emergency tracheostomy may be needed."],
["Acoustic neuroma", "Schwannoma of CN VIII (vestibular division) in internal auditory meatus / CPA", "Unilateral SNHL + tinnitus + vertigo. ABCD mnemonic: Auditory symptoms, Balance issues, CN involvement, Detected on MRI."],
["Otitis media (glue ear)", "Eustachian tube dysfunction → fluid in middle ear → conductive HL", "MC cause of HL in children. Flat type B tympanogram. Rx: Grommet insertion."],
["Meniere's disease", "Endolymphatic hydrops (excess endolymph) in cochlea & vestibular system", "Triad: episodic vertigo + SNHL + tinnitus. Low-frequency SNHL initially. Rx: Salt restriction, betahistine, diuretics."],
]
clin_t = Table(clinical, colWidths=[42*mm, 68*mm, 55*mm])
clin_t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), C_DARK),
("TEXTCOLOR", (0,0), (-1,0), C_WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("LEADING", (0,0), (-1,-1), 12),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("ROWBACKGROUNDS",(0,1), (-1,-1), [C_WHITE, C_LIGHT]),
("GRID", (0,0), (-1,-1), 0.4, C_MID),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
add(clin_t)
add(Spacer(1, 10))
# Final note
final_data = [[Paragraph(
"<b>Sources:</b> Cummings Otolaryngology Head and Neck Surgery (Flint et al.); "
"Scott-Brown's Otorhinolaryngology Head & Neck Surgery (Gleeson et al.); "
"K.J. Lee's Essential Otolaryngology; Gray's Anatomy for Students; "
"Miller's Anesthesia 10e — compiled and adapted for MBBS study.", sCaption)]]
final_t = Table(final_data, colWidths=[W - 30*mm])
final_t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), C_LIGHT),
("BOX", (0,0), (-1,-1), 0.5, C_MID),
("TOPPADDING", (0,0), (-1,-1), 8),
("BOTTOMPADDING", (0,0), (-1,-1), 8),
("LEFTPADDING", (0,0), (-1,-1), 10),
]))
add(final_t)
# ─── BUILD ────────────────────────────────────────────────────────────────────
doc = SimpleDocTemplate(
OUT,
pagesize=A4,
leftMargin=15*mm,
rightMargin=15*mm,
topMargin=20*mm,
bottomMargin=22*mm,
title="ENT Anatomy — Complete MBBS Study Guide",
author="Orris Medical AI",
subject="Ear Nose Throat Anatomy",
)
doc.build(story, onFirstPage=on_page, onLaterPages=on_page)
print(f"PDF created: {OUT}")
cd /home/daytona/workspace/ent-anatomy && python3 build_pdf.py 2>&1
ls -lh /home/daytona/workspace/ent-anatomy/ENT_Anatomy_Complete_StudyGuide.pdf
ENT Anatomy Complete StudyGuide
PDF Document · PDF
Make a clinical case presentation showing how anatomy explains pathology
mkdir -p /home/daytona/workspace/ent-cases && ls /home/daytona/workspace/ent-ana…
Retry
mkdir -p /home/daytona/workspace/ent-cases && ls /home/daytona/workspace/ent-ana…
~/ent-cases/build_cases.js
const pptxgen = require("pptxgenjs");
const path = require("path");
const fs = require("fs");
const pres = new pptxgen();
pres.layout = "LAYOUT_16x9";
pres.author = "Orris Medical AI";
pres.title = "ENT Clinical Case Presentations – Anatomy Explains Pathology";
// ── PALETTE ──────────────────────────────────────────────────────────────────
const C = {
navy: "0D2137",
blue: "1A6FA8",
blueLt: "D6EAF8",
green: "1E8449",
greenLt: "D5F5E3",
red: "A93226",
redLt: "FADBD8",
gold: "D4AC0D",
goldLt: "FEF9E7",
orange: "E67E22",
purple: "6C3483",
teal: "117A65",
white: "FFFFFF",
offwhite: "F2F3F4",
dark: "1C2833",
mid: "5D6D7E",
light: "EAF4FC",
};
const IMG = "/home/daytona/workspace/ent-anatomy/images";
// ── HELPERS ──────────────────────────────────────────────────────────────────
function imgData(filename) {
const p = path.join(IMG, filename);
if (!fs.existsSync(p)) return null;
const ext = path.extname(filename).slice(1).toLowerCase();
const mime = ext === "png" ? "image/png" : "image/jpeg";
return `${mime};base64,${fs.readFileSync(p).toString("base64")}`;
}
// Full dark background
function darkBg(slide, accent) {
slide.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.navy } });
if (accent) {
slide.addShape(pres.ShapeType.rect, { x: 0, y: 5.3, w: 10, h: 0.325, fill: { color: accent } });
}
}
// Light background with coloured left sidebar
function lightBg(slide, sideColor) {
slide.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.offwhite } });
if (sideColor) {
slide.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 0.12, h: 5.625, fill: { color: sideColor } });
}
}
// Section divider slide
function sectionSlide(title, subtitle, accentColor, emoji) {
const slide = pres.addSlide();
darkBg(slide, accentColor);
// big accent bar
slide.addShape(pres.ShapeType.rect, { x: 0, y: 1.6, w: 0.5, h: 2.4, fill: { color: accentColor } });
slide.addText(emoji || "", { x: 0.7, y: 1.2, w: 1.2, h: 1.2, fontSize: 48, align: "center" });
slide.addText(title, {
x: 0.7, y: 1.5, w: 8.8, h: 1.1,
fontSize: 36, bold: true, color: C.white, fontFace: "Calibri",
});
slide.addText(subtitle, {
x: 0.7, y: 2.7, w: 8.5, h: 0.8,
fontSize: 18, color: accentColor, fontFace: "Calibri", italic: true,
});
return slide;
}
// Case header slide (dark, coloured accent strip on left + case # badge)
function caseHeaderSlide(caseNum, title, patient, accentColor, regionLabel) {
const slide = pres.addSlide();
darkBg(slide, accentColor);
slide.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 0.45, h: 5.625, fill: { color: accentColor } });
// Badge
slide.addShape(pres.ShapeType.rect, { x: 0.65, y: 0.25, w: 1.5, h: 0.55,
fill: { color: accentColor }, line: { color: accentColor } });
slide.addText(`CASE ${caseNum}`, { x: 0.65, y: 0.25, w: 1.5, h: 0.55,
fontSize: 13, bold: true, color: C.navy, align: "center", valign: "middle", fontFace: "Calibri" });
// Region label
slide.addShape(pres.ShapeType.rect, { x: 2.3, y: 0.25, w: 1.6, h: 0.55,
fill: { color: "FFFFFF20" }, line: { color: accentColor, width: 1 } });
slide.addText(regionLabel, { x: 2.3, y: 0.25, w: 1.6, h: 0.55,
fontSize: 11, color: accentColor, align: "center", valign: "middle", fontFace: "Calibri" });
// Title
slide.addText(title, {
x: 0.65, y: 0.95, w: 9.1, h: 1.3,
fontSize: 30, bold: true, color: C.white, fontFace: "Calibri", wrap: true,
});
// Patient line
slide.addText(patient, {
x: 0.65, y: 2.35, w: 9.1, h: 0.55,
fontSize: 16, color: accentColor, fontFace: "Calibri", italic: true,
});
// Divider
slide.addShape(pres.ShapeType.line, { x: 0.65, y: 3.0, w: 9.1, h: 0, line: { color: accentColor, width: 1 } });
slide.addText("How anatomy explains this condition →", {
x: 0.65, y: 3.15, w: 9.1, h: 0.45,
fontSize: 13, color: C.mid, fontFace: "Calibri", italic: true,
});
return slide;
}
// Two-column content slide
function twoColSlide(slideTitle, leftTitle, leftBullets, rightTitle, rightBullets, accentColor, bgDark) {
const slide = pres.addSlide();
if (bgDark) { darkBg(slide, accentColor); }
else { lightBg(slide, accentColor); }
const tc = bgDark ? C.white : C.dark;
const bc = bgDark ? C.offwhite : C.dark;
// Slide title bar
slide.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 0.65, fill: { color: accentColor } });
slide.addText(slideTitle, { x: 0.2, y: 0, w: 9.6, h: 0.65,
fontSize: 15, bold: true, color: C.navy, fontFace: "Calibri", valign: "middle" });
// Left panel
slide.addShape(pres.ShapeType.rect, { x: 0.18, y: 0.8, w: 4.55, h: 4.6,
fill: { color: bgDark ? "1A2A3A" : C.white }, line: { color: accentColor, width: 1.2 } });
slide.addText(leftTitle, { x: 0.28, y: 0.88, w: 4.35, h: 0.42,
fontSize: 12, bold: true, color: accentColor, fontFace: "Calibri" });
const leftItems = leftBullets.map((b, i) => ({
text: b, options: { bullet: { type: "bullet" }, fontSize: 10.5, color: bc,
fontFace: "Calibri", breakLine: i < leftBullets.length - 1 }
}));
slide.addText(leftItems, { x: 0.3, y: 1.38, w: 4.3, h: 3.85, valign: "top", wrap: true });
// Right panel
slide.addShape(pres.ShapeType.rect, { x: 5.27, y: 0.8, w: 4.55, h: 4.6,
fill: { color: bgDark ? "1A2A3A" : C.white }, line: { color: accentColor, width: 1.2 } });
slide.addText(rightTitle, { x: 5.37, y: 0.88, w: 4.35, h: 0.42,
fontSize: 12, bold: true, color: accentColor, fontFace: "Calibri" });
const rightItems = rightBullets.map((b, i) => ({
text: b, options: { bullet: { type: "bullet" }, fontSize: 10.5, color: bc,
fontFace: "Calibri", breakLine: i < rightBullets.length - 1 }
}));
slide.addText(rightItems, { x: 5.38, y: 1.38, w: 4.3, h: 3.85, valign: "top", wrap: true });
return slide;
}
// Anatomy → Pathology flow slide (3 boxes with arrows)
function flowSlide(slideTitle, boxes, accentColor) {
// boxes = [{icon, label, text}, ...]
const slide = pres.addSlide();
lightBg(slide, accentColor);
slide.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 0.65, fill: { color: accentColor } });
slide.addText(slideTitle, { x: 0.2, y: 0, w: 9.6, h: 0.65,
fontSize: 15, bold: true, color: C.navy, fontFace: "Calibri", valign: "middle" });
const n = boxes.length;
const bw = 2.5, bh = 3.8, gap = (10 - 0.2 - n * bw - (n - 1) * 0.3) / 2;
let cx = gap;
boxes.forEach((box, i) => {
// Box
slide.addShape(pres.ShapeType.rect, { x: cx, y: 0.9, w: bw, h: bh,
fill: { color: C.white }, line: { color: accentColor, width: 1.5 } });
// Icon / label header
slide.addShape(pres.ShapeType.rect, { x: cx, y: 0.9, w: bw, h: 0.6, fill: { color: accentColor } });
slide.addText(box.label, { x: cx, y: 0.9, w: bw, h: 0.6,
fontSize: 12, bold: true, color: C.navy, align: "center", valign: "middle", fontFace: "Calibri" });
// Body text
const items = box.text.map((t, j) => ({
text: t, options: { bullet: { type: "bullet" }, fontSize: 10, color: C.dark,
fontFace: "Calibri", breakLine: j < box.text.length - 1 }
}));
slide.addText(items, { x: cx + 0.1, y: 1.57, w: bw - 0.2, h: 3.05, valign: "top", wrap: true });
// Arrow between boxes
if (i < n - 1) {
const ax = cx + bw + 0.05;
slide.addShape(pres.ShapeType.line, { x: ax, y: 2.75, w: 0.2, h: 0, line: { color: accentColor, width: 2 } });
slide.addText("→", { x: ax, y: 2.5, w: 0.3, h: 0.5, fontSize: 20, color: accentColor, align: "center" });
}
cx += bw + 0.3;
});
return slide;
}
// Anatomy diagram slide with image + annotation
function diagramSlide(slideTitle, imgFile, caption, annotationTitle, bullets, accentColor) {
const slide = pres.addSlide();
lightBg(slide, accentColor);
slide.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 0.65, fill: { color: accentColor } });
slide.addText(slideTitle, { x: 0.2, y: 0, w: 9.6, h: 0.65,
fontSize: 15, bold: true, color: C.navy, fontFace: "Calibri", valign: "middle" });
const data = imgData(imgFile);
if (data) {
slide.addImage({ data, x: 0.2, y: 0.75, w: 5.5, h: 4.0 });
}
slide.addText(caption, { x: 0.2, y: 4.8, w: 5.5, h: 0.5,
fontSize: 8, italic: true, color: C.mid, fontFace: "Calibri", align: "center" });
// Right annotation panel
slide.addShape(pres.ShapeType.rect, { x: 5.9, y: 0.75, w: 3.9, h: 4.55,
fill: { color: C.light }, line: { color: accentColor, width: 1.2 } });
slide.addText(annotationTitle, { x: 6.0, y: 0.82, w: 3.7, h: 0.45,
fontSize: 12, bold: true, color: accentColor, fontFace: "Calibri" });
const items = bullets.map((b, i) => ({
text: b, options: { bullet: { type: "bullet" }, fontSize: 10, color: C.dark,
fontFace: "Calibri", breakLine: i < bullets.length - 1 }
}));
slide.addText(items, { x: 6.0, y: 1.35, w: 3.7, h: 3.85, valign: "top", wrap: true });
return slide;
}
// Clinical pearl slide (dark bg, big quote-style)
function pearlSlide(caseNum, title, pearl, anatomy, takeaway, accentColor) {
const slide = pres.addSlide();
darkBg(slide, accentColor);
slide.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 0.45, h: 5.625, fill: { color: accentColor } });
slide.addText(`CASE ${caseNum} — KEY PEARL`, { x: 0.65, y: 0.25, w: 9.1, h: 0.5,
fontSize: 13, color: accentColor, bold: true, fontFace: "Calibri" });
slide.addText(title, { x: 0.65, y: 0.8, w: 9.1, h: 0.75,
fontSize: 22, bold: true, color: C.white, fontFace: "Calibri", wrap: true });
// 3 cards
const cards = [
{ label: "Anatomy Basis", text: anatomy, color: accentColor },
{ label: "Clinical Pearl", text: pearl, color: C.gold },
{ label: "Exam Takeaway", text: takeaway, color: C.green },
];
cards.forEach((card, i) => {
const cx = 0.6 + i * 3.15;
slide.addShape(pres.ShapeType.rect, { x: cx, y: 1.75, w: 2.9, h: 3.5,
fill: { color: "1A2A3A" }, line: { color: card.color, width: 1.5 } });
slide.addShape(pres.ShapeType.rect, { x: cx, y: 1.75, w: 2.9, h: 0.5, fill: { color: card.color } });
slide.addText(card.label, { x: cx, y: 1.75, w: 2.9, h: 0.5,
fontSize: 11, bold: true, color: C.navy, align: "center", valign: "middle", fontFace: "Calibri" });
slide.addText(card.text, { x: cx + 0.1, y: 2.32, w: 2.7, h: 2.85,
fontSize: 10, color: C.white, fontFace: "Calibri", wrap: true, valign: "top" });
});
return slide;
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 1 — COVER
// ═══════════════════════════════════════════════════════════════════════════
{
const slide = pres.addSlide();
darkBg(slide, null);
// Tri-colour top strip (ear/nose/throat)
slide.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 3.33, h: 0.18, fill: { color: C.blue } });
slide.addShape(pres.ShapeType.rect, { x: 3.33, y: 0, w: 3.33, h: 0.18, fill: { color: C.green } });
slide.addShape(pres.ShapeType.rect, { x: 6.66, y: 0, w: 3.34, h: 0.18, fill: { color: C.red } });
slide.addText("ENT CLINICAL CASE PRESENTATIONS", {
x: 0.5, y: 0.5, w: 9, h: 1.0,
fontSize: 30, bold: true, color: C.white, fontFace: "Calibri",
align: "center", charSpacing: 2,
});
slide.addText("How Anatomy Explains Pathology", {
x: 0.5, y: 1.6, w: 9, h: 0.65,
fontSize: 20, color: C.gold, fontFace: "Calibri", align: "center", italic: true,
});
// 3 region labels
const regions = [
{ label: "EAR", color: C.blue, x: 0.6 },
{ label: "NOSE", color: C.green, x: 3.7 },
{ label: "THROAT", color: C.red, x: 6.8 },
];
regions.forEach(r => {
slide.addShape(pres.ShapeType.rect, { x: r.x, y: 2.5, w: 2.6, h: 0.55,
fill: { color: r.color + "33" }, line: { color: r.color, width: 1.5 } });
slide.addText(r.label, { x: r.x, y: 2.5, w: 2.6, h: 0.55,
fontSize: 16, bold: true, color: r.color, align: "center", valign: "middle", fontFace: "Calibri" });
});
// Case list
const cases = [
"Case 1 — Otitis Media with Effusion (Glue Ear)",
"Case 2 — Unsafe CSOM / Cholesteatoma",
"Case 3 — Epistaxis (Anterior & Posterior)",
"Case 4 — Acute Rhinosinusitis → Orbital Complication",
"Case 5 — Peritonsillar Abscess (Quinsy)",
"Case 6 — Epiglottitis",
"Case 7 — Recurrent Laryngeal Nerve Palsy",
];
const caseItems = cases.map((c, i) => ({
text: c, options: { bullet: { type: "bullet" }, fontSize: 10.5, color: C.offwhite,
fontFace: "Calibri", breakLine: i < cases.length - 1 }
}));
slide.addShape(pres.ShapeType.rect, { x: 0.5, y: 3.2, w: 9, h: 2.1,
fill: { color: "FFFFFF10" }, line: { color: C.mid, width: 0.5 } });
slide.addText(caseItems, { x: 0.65, y: 3.28, w: 8.7, h: 2.0, valign: "top" });
slide.addText("Sources: Cummings Otolaryngology · Scott-Brown's · K.J. Lee's · Gray's Anatomy · Miller's Anesthesia 10e", {
x: 0.5, y: 5.35, w: 9, h: 0.25,
fontSize: 7.5, italic: true, color: C.mid, align: "center", fontFace: "Calibri",
});
}
// ═══════════════════════════════════════════════════════════════════════════
// CASE 1 — OTITIS MEDIA WITH EFFUSION (GLUE EAR)
// ═══════════════════════════════════════════════════════════════════════════
sectionSlide("EAR CASES", "Cases 1 & 2 — Understanding Ear Pathology Through Anatomy", C.blue, "👂");
caseHeaderSlide(1,
"Otitis Media with Effusion\n(Glue Ear)",
"Patient: 5-year-old boy | Complaint: Hearing loss, inattentiveness at school, recurrent ear infections",
C.blue, "EAR");
twoColSlide(
"Case 1 — Presentation & Anatomy Basis",
"Clinical Presentation",
[
"5-yr-old boy, parents report he 'doesn't listen' and watches TV too loud",
"Recurrent colds & ear infections for 6 months",
"Otoscopy: dull, retracted TM, no light reflex, amber fluid visible behind TM",
"Pure tone audiometry: bilateral conductive hearing loss 25–35 dB",
"Tympanometry: flat (Type B) — no TM movement",
"No fever, no ear pain at time of visit",
],
"Key Anatomical Basis",
[
"Children's Eustachian tube is ~35 mm long & lies at ~10° (nearly horizontal) vs adult 45°",
"Short horizontal tube → nasopharyngeal secretions reflux easily into middle ear",
"Immature mucociliary clearance adds to poor drainage",
"Adenoid hypertrophy in nasopharynx physically blocks Eustachian tube orifice",
"Middle ear ventilation fails → negative pressure → fluid accumulates in tympanic cavity",
"Ossicular movement (malleus→incus→stapes) is dampened by fluid → conductive HL",
],
C.blue, false);
flowSlide(
"Case 1 — Anatomy → Pathology → Disease Flow",
[
{
label: "NORMAL ANATOMY",
text: [
"Eustachian tube opens during swallowing/yawning",
"Levator & tensor veli palatini dilate the tube",
"Middle ear pressure equalised with ambient air",
"Mucociliary escalator clears secretions → nasopharynx",
]
},
{
label: "ANATOMIC VULNERABILITY",
text: [
"Child's tube: 35 mm, nearly horizontal",
"Adenoids near Eustachian tube ostium in nasopharynx",
"Immature cartilage → tube collapses more easily",
"Viral URTI → mucosal oedema → tube obstruction",
]
},
{
label: "GLUE EAR",
text: [
"Blocked tube → negative pressure in middle ear",
"TM retraction → fluid transudation",
"Mucus-like viscous 'glue' fills middle ear",
"Ossicles immobilised → Conductive HL 25-45 dB",
"Flat (Type B) tympanogram",
]
},
], C.blue);
pearlSlide(1,
"Otitis Media with Effusion — Why Children Are Vulnerable",
"Flat Type B tympanogram = no TM movement = middle ear fluid. Type A (normal), Type C (negative pressure/early OME). Grommet (ventilation tube) bypasses the dysfunctional Eustachian tube → immediate improvement in hearing.",
"Child's Eustachian tube is short (35 mm), horizontal, and poorly supported — the single most important anatomical reason why glue ear affects children 100× more than adults. In adults (45° angle, 38 mm), gravity aids drainage.",
"MCQ: Why do children get more OME? — Horizontal Eustachian tube + adenoid hypertrophy blocking its nasopharyngeal opening. Treatment = grommets (ventilation tubes). Adenoidectomy helps by clearing the obstruction.",
C.blue);
// ═══════════════════════════════════════════════════════════════════════════
// CASE 2 — UNSAFE CSOM / CHOLESTEATOMA
// ═══════════════════════════════════════════════════════════════════════════
caseHeaderSlide(2,
"Chronic Suppurative Otitis Media\n(Unsafe — Cholesteatoma)",
"Patient: 28-year-old man | Complaint: Foul-smelling ear discharge, progressive hearing loss, new facial weakness",
C.blue, "EAR");
twoColSlide(
"Case 2 — Presentation & Anatomy Basis",
"Clinical Presentation",
[
"28-yr-old, chronic smelly ear discharge for 5 years",
"Progressive left-sided hearing loss",
"Sudden onset left facial weakness (forehead involved) — LMN palsy",
"Otoscopy: attic (pars flaccida) perforation, whitish pearly mass visible",
"CT mastoid: bony erosion of ossicular chain + lateral semicircular canal",
"Audiogram: mixed hearing loss (conductive + sensorineural component)",
],
"Key Anatomical Basis",
[
"Pars flaccida (Shrapnell's membrane) = WEAK POINT of TM — no middle fibrous layer",
"Attic (epitympanum) communicates directly with mastoid antrum via aditus",
"Keratin-producing squamous epithelium grows through attic perforation",
"Cholesteatoma secretes collagenases → erodes bone (ossicles, semicircular canal, tegmen, facial nerve canal)",
"Facial nerve runs through middle ear in bony canal — dehiscence common → nerve exposed to erosion",
"Mastoid air cells connect to posterior fossa → intracranial spread risk",
],
C.blue, false);
flowSlide(
"Case 2 — Why Cholesteatoma Causes Facial Palsy: Anatomy Pathway",
[
{
label: "ANATOMY SETUP",
text: [
"Pars flaccida has no middle fibrous layer → weakest part of TM",
"Attic directly above TM",
"Facial nerve: labyrinthine → geniculate ganglion → tympanic (horizontal) segment → mastoid segment",
"Tympanic segment passes just above oval window in mesotympanum",
]
},
{
label: "CHOLESTEATOMA GROWS",
text: [
"Squamous epithelium invades attic through pars flaccida defect",
"Accumulates keratin (desquamated cells) = expanding mass",
"Enzymatic bone erosion: long process of incus first (most vulnerable ossicle — single nutrient vessel)",
"Erosion spreads medially toward facial nerve canal",
]
},
{
label: "COMPLICATIONS",
text: [
"Ossicular erosion → conductive HL",
"Lateral SCC erosion → SNHL + vertigo (labyrinthine fistula)",
"Facial nerve canal erosion → LMN facial palsy",
"Tegmen (bone above = middle fossa floor) erosion → meningitis",
"Treatment: mastoidectomy surgery",
]
},
], C.blue);
pearlSlide(2,
"Unsafe vs Safe CSOM — The Anatomy of Danger",
"Unsafe CSOM: attic (pars flaccida) perforation + cholesteatoma. Safe CSOM: central (pars tensa) perforation + mucosal disease. SAFE = Safe = central = no cholesteatoma. UNSAFE = Attic = bone erosion = life-threatening complications.",
"Pars flaccida has NO middle fibrous layer → cannot resist retraction pocket formation. This is the structural basis of 'unsafe' CSOM. The most vulnerable ossicle is the long process of the INCUS (single nutrient vessel, no collateral). Facial nerve tympanic segment is closest → eroded early.",
"MCQ: 'Foul-smelling discharge + attic perforation + facial palsy' = Cholesteatoma until proven otherwise. CT mastoid shows bony erosion. Treatment = canal wall down or canal wall up mastoidectomy. Unsafe = Always needs surgery.",
C.blue);
// ═══════════════════════════════════════════════════════════════════════════
// CASE 3 — EPISTAXIS
// ═══════════════════════════════════════════════════════════════════════════
sectionSlide("NOSE CASES", "Cases 3 & 4 — Understanding Nasal Pathology Through Anatomy", C.green, "👃");
caseHeaderSlide(3,
"Epistaxis — Anterior vs Posterior",
"Patient A: 8-year-old girl — nose bleed after nose-picking | Patient B: 70-year-old hypertensive man — massive nose bleed, blood going to throat",
C.green, "NOSE");
twoColSlide(
"Case 3 — Two Types of Epistaxis: Anatomy Explains the Difference",
"Patient A — Anterior Epistaxis",
[
"8-yr-old, bleeding from anterior nares after nose-picking",
"Blood visible at nostril, easily controlled by pinching",
"Anatomy: Little's area (Kiesselbach's plexus) on anteroinferior septum",
"5 arteries anastomose here: Ant. ethmoidal (ICA) + Sphenopalatine + Greater palatine + Superior labial + Septal (all ECA branches)",
"Rich submucosal plexus on thin mucosa over cartilage → easily traumatised",
"Treatment: pinch 10 min → silver nitrate cautery → BIPP packing if fails",
],
"Patient B — Posterior Epistaxis",
[
"70-yr-old hypertensive, blood flowing down throat, unable to pinch",
"Anatomy: Woodruff's plexus on posterior lateral nasal wall (inferior turbinate level)",
"Fed by sphenopalatine artery (main nasal artery, from maxillary artery ECA)",
"Hypertension → atheromatous vessel rupture → arterial bleed → massive haemorrhage",
"Cannot control with anterior pinching — source is deep in posterior nasal cavity",
"Rx: posterior nasal packing → endoscopic sphenopalatine artery ligation",
],
C.green, false);
diagramSlide(
"Case 3 — Nasal Blood Supply: Anatomy of Epistaxis Sites",
"ent_fig_airway_overview.png",
"Fig: Sagittal view showing nasal cavity vascular territory (Miller's Anesthesia 10e)",
"Kiesselbach's Plexus — Key Facts",
[
"Location: anteroinferior nasal septum (Little's area)",
"Why vulnerable: thin mucosa over cartilage, rich anastomotic plexus of 5 arteries",
"ICA + ECA watershed zone — dual supply",
"90% of all epistaxis is anterior = from Kiesselbach's",
"Woodruff's plexus = posterior lateral wall = posterior epistaxis (10% but more dangerous)",
"Sphenopalatine artery = KEY artery for posterior epistaxis ligation",
"Sphenopalatine foramen: behind posterior end of middle turbinate (surgical landmark)",
],
C.green);
pearlSlide(3,
"Epistaxis — Anatomy Determines Site, Treatment & Severity",
"Anterior bleed (Little's area): visible, pinchable, cauterisable. Posterior bleed (Woodruff's): blood flows back into throat, not visible anteriorly, requires packing or surgery. Age pattern: children = anterior; elderly hypertensives = posterior.",
"Kiesselbach's plexus sits on the thin mucosa over the QUADRILATERAL CARTILAGE of septum — the softest, most vascular point. Woodruff's plexus is at the posterior end of the INFERIOR TURBINATE, fed directly by the sphenopalatine artery (largest nasal artery). High BP ruptures this muscular artery → catastrophic bleed.",
"MCQ: Most common site of epistaxis = Little's area / Kiesselbach's plexus. Artery responsible for posterior epistaxis requiring surgical ligation = Sphenopalatine artery. Surgical landmark to find it = behind posterior end of MIDDLE turbinate (not inferior!).",
C.green);
// ═══════════════════════════════════════════════════════════════════════════
// CASE 4 — ACUTE SINUSITIS → ORBITAL COMPLICATION
// ═══════════════════════════════════════════════════════════════════════════
caseHeaderSlide(4,
"Acute Rhinosinusitis →\nOrbital Complication (Chandler's)",
"Patient: 12-year-old boy | Complaint: Periorbital swelling, eye pain, fever after 5-day cold",
C.green, "NOSE");
twoColSlide(
"Case 4 — Presentation & Anatomical Pathway of Orbital Spread",
"Clinical Presentation",
[
"12-yr-old, 5-day URTI, now: left periorbital swelling, eye pain, high fever",
"Examination: proptosis, restricted eye movement (EOM), conjunctival chemosis",
"Visual acuity reduced on left",
"CT orbit/sinuses: left ethmoid sinusitis + subperiosteal abscess medial wall of orbit",
"Chandler's Classification: Stage III (subperiosteal abscess)",
"Requires IV antibiotics + surgical drainage (FESS + orbital decompression)",
],
"Anatomical Basis — Why Ethmoid Sinus Spreads to Orbit",
[
"Lamina papyracea (Latin: 'paper plate') = medial wall of orbit = lateral wall of ethmoid",
"Only 0.2–0.4 mm thick — thinnest bone in the face, paper-thin",
"Valves of Breschet: small venous channels through lamina papyracea (no valves → bidirectional flow)",
"Inflammation in ethmoid sinus → direct spread through thin bone or valveless veins",
"Subperiosteal space between lamina papyracea and orbital periosteum → subperiosteal abscess",
"Left untreated: spreads to orbital fat (Stage IV) → cavernous sinus thrombosis (Stage V)",
],
C.green, false);
pearlSlide(4,
"Orbital Complications of Sinusitis — All About the Lamina Papyracea",
"Chandler's Stages: I=Inflammatory oedema → II=Orbital cellulitis → III=Subperiosteal abscess → IV=Orbital abscess → V=Cavernous sinus thrombosis. Proptosis + restricted EOM + chemosis = at least Stage II. Reduced vision = emergency (Stage IV/V).",
"The LAMINA PAPYRACEA is paper-thin (0.2 mm) and directly separates the ethmoid air cells from the orbital contents. Valveless venous communications (Breschet veins) allow bidirectional spread. This is the #1 reason why ethmoid sinusitis (not maxillary or frontal) is the most common source of orbital complications in children.",
"MCQ: Most common sinus causing orbital complications in children = ETHMOID. Anatomical weak point = Lamina papyracea. Key finding on CT = subperiosteal collection medial to orbit. Cavernous sinus thrombosis = proptosis + 3rd/4th/6th nerve palsy + septic state. Treat with IV antibiotics ± surgery.",
C.green);
// ═══════════════════════════════════════════════════════════════════════════
// CASE 5 — PERITONSILLAR ABSCESS
// ═══════════════════════════════════════════════════════════════════════════
sectionSlide("THROAT CASES", "Cases 5, 6 & 7 — Understanding Throat Pathology Through Anatomy", C.red, "🗣️");
caseHeaderSlide(5,
"Peritonsillar Abscess (Quinsy)",
"Patient: 19-year-old woman | Complaint: Severe sore throat, difficulty opening mouth, 'hot-potato voice'",
C.red, "THROAT");
twoColSlide(
"Case 5 — Presentation & Anatomy of Quinsy",
"Clinical Presentation",
[
"19-yr-old, 3-day severe R-sided sore throat, worsening despite antibiotics",
"Unable to open mouth fully (trismus) — spasm of medial pterygoid muscle",
"Muffled 'hot-potato' voice, drooling (unable to swallow saliva)",
"Examination: uvula deviated to LEFT (away from abscess), right anterior pillar bulging",
"Fluctuant swelling at soft palate, superior pole of right tonsil",
"Rx: incision & drainage at junction of anterior pillar and soft palate + IV antibiotics",
],
"Anatomical Basis of Each Sign",
[
"Space between tonsil capsule and SUPERIOR CONSTRICTOR muscle fills with pus",
"Trismus: abscess pressure on medial pterygoid (just lateral to superior constrictor) → reflex spasm",
"Uvula deviated AWAY from side of abscess: unilateral swelling pushes uvula contralaterally",
"Hot-potato voice: palatal oedema distorts resonance of speech",
"Anterior pillar bulge: palatoglossal fold displaced by pus tracking superiorly",
"Danger: pus may spread to PARAPHARYNGEAL space → mediastinitis (descending necrotising mediastinitis)",
],
C.red, false);
pearlSlide(5,
"Peritonsillar Abscess — Every Sign Explained by Anatomy",
"Pus in peritonsillar space → uvula pushed AWAY from abscess (contralateral deviation). This is pathognomonic. Trismus = medial pterygoid irritation. Hot-potato voice = palatal distortion. I&D point = at junction of anterior pillar and soft palate — safest to avoid internal carotid artery (lies 2.5 cm posterolateral to tonsil).",
"The peritonsillar space (between tonsil capsule and superior constrictor) is the site. The internal carotid artery lies 2.5 cm posterolateral to the tonsil — I&D must never go too deep/lateral. The anterior pillar = palatoglossal fold. The posterior pillar = palatopharyngeal fold. Waldeyer's ring lymphoid tissue is the primary immunological barrier here.",
"MCQ: Uvula deviated AWAY from abscess = peritonsillar abscess. Trismus = medial pterygoid spasm (NOT masseteric). Drooling + hot-potato voice = supraglottic or peritonsillar pathology. NEVER confuse with Ludwig's angina (floor of mouth) — that causes chin swelling + airway compromise from below.",
C.red);
// ═══════════════════════════════════════════════════════════════════════════
// CASE 6 — EPIGLOTTITIS
// ═══════════════════════════════════════════════════════════════════════════
caseHeaderSlide(6,
"Acute Epiglottitis",
"Patient: 35-year-old man | Complaint: Severe sore throat, drooling, high fever, progressive breathing difficulty",
C.red, "THROAT");
twoColSlide(
"Case 6 — Presentation & Anatomy of Epiglottitis",
"Clinical Presentation",
[
"35-yr-old, 12-hour history: sudden onset severe odynophagia, high fever 39.8°C",
"Drooling (cannot swallow saliva), muffled voice, no cough",
"Sits in 'tripod' or 'sniffing' position to maximise airway",
"Lateral neck X-ray: 'thumb sign' — swollen epiglottis shape",
"Laryngoscopy (ICU only): bright red, cherry-red swollen epiglottis",
"DO NOT examine oropharynx in A&E — may cause complete obstruction",
],
"Anatomical Basis — Why Epiglottitis is a Airway Emergency",
[
"Epiglottis = elastic cartilage leaf at C3 level, attached to thyroid cartilage via thyroepiglottic ligament",
"Supraglottic space has abundant loose connective tissue → rapid oedema spread",
"Epiglottis sits at entrance to larynx (laryngeal inlet / aditus) — covers inlet during swallowing",
"When inflamed: swells rapidly (cherry-red ball) → narrows/occludes laryngeal inlet",
"Supraglottis has rich lymphatics + blood supply → oedema can double volume in 2–4 hours",
"Unlike subglottic croup (cricoid limits swelling), supraglottis has NO rigid surrounding structure → unconstrained oedema",
],
C.red, false);
diagramSlide(
"Case 6 — Laryngeal Anatomy: Supraglottis vs Subglottis in Airway Obstruction",
"ent_fig3_larynx_nerves.png",
"Fig: Laryngeal anatomy — supraglottic rich lymphatics vs subglottic cricoid constraint (Miller's Anesthesia 10e)",
"Why Supraglottis Swells Faster",
[
"Supraglottis: LOOSE connective tissue, RICH lymphatics → unconstrained rapid oedema",
"Subglottis: bounded by RIGID cricoid ring → oedema constrained → causes stridor (croup)",
"Epiglottitis: thumb sign on lateral X-ray = swollen epiglottis silhouette",
"Croup (LTB): steeple sign on AP X-ray = subglottic narrowing at cricoid",
"Adults: epiglottitis more common, often H. influenzae type b or Strep",
"Children: narrowest point = subglottis → croup more common than epiglottitis",
"Emergency: intubate in theatre / ICU — NEVER force in A&E (vagal arrest risk)",
],
C.red);
pearlSlide(6,
"Epiglottitis — Supraglottic Anatomy Creates the Emergency",
"Thumb sign (lateral X-ray) = epiglottitis. Steeple sign (AP X-ray) = croup. Treatment: take to theatre with ENT + anaesthetics. Spray vocal cords with local anaesthetic via flexible scope, then intubate. Racemic epinephrine has NO role (unlike croup). IV ceftriaxone. Dexamethasone reduces oedema.",
"The supraglottis has NO bony or cartilaginous constraint — unlike the subglottis (bounded by the cricoid ring). Inflammation produces unchecked oedema of the epiglottis, arytenoids, and aryepiglottic folds — this is the anatomy of a supraglottic emergency. The laryngeal inlet can be completely obliterated within hours.",
"MCQ: Epiglottitis = thumb sign = adult predominance now (Hib vaccine reduced childhood cases). Croup = steeple sign = subglottic = children. KEY: In epiglottitis, DO NOT examine throat in A&E — can cause laryngospasm and death. Secure airway in theatre FIRST. Causative organism = H. influenzae type b (adults: also GAS, Staph aureus).",
C.red);
// ═══════════════════════════════════════════════════════════════════════════
// CASE 7 — RLN PALSY
// ═══════════════════════════════════════════════════════════════════════════
caseHeaderSlide(7,
"Left Recurrent Laryngeal Nerve Palsy",
"Patient: 58-year-old male smoker | Complaint: 3-month history of hoarseness, weight loss, dysphagia",
C.red, "THROAT");
twoColSlide(
"Case 7 — Presentation & Anatomy of RLN Palsy",
"Clinical Presentation",
[
"58-yr-old smoker, 3-month hoarseness (onset insidious)",
"Weight loss 8 kg, dysphagia to solids, dry cough",
"Voice: weak, breathy, 'bovine' cough (not explosive)",
"Laryngoscopy: LEFT vocal cord immobile in paramedian (adducted) position",
"CT chest: large left hilar mass, mediastinal lymphadenopathy",
"Diagnosis: left lung cancer with RLN involvement — Ortner syndrome",
],
"Anatomical Basis — Why LEFT RLN is Vulnerable",
[
"Right RLN: branches from right vagus at right subclavian artery level → loops under it → short mediastinal course",
"Left RLN: branches from left vagus in chest → loops under AORTIC ARCH → ascends in tracheoesophageal groove",
"Left RLN total length: ~30 cm in mediastinum before reaching larynx (vs right ~10 cm)",
"Left RLN passes close to: aortic arch, pulmonary artery, left main bronchus, mediastinal lymph nodes",
"Lung cancer at left hilum → compresses or invades left RLN in this segment",
"RLN supplies ALL intrinsic laryngeal muscles EXCEPT cricothyroid → paralysis = cord adducted (PCA paralysed)",
],
C.red, false);
diagramSlide(
"Case 7 — Course of Left vs Right RLN: Anatomy of Vulnerability",
"ent_fig1_sagittal.png",
"Fig: Sagittal ENT anatomy — larynx and surrounding structures (Miller's Anesthesia 10e)",
"Left RLN — Why It Is Long & Vulnerable",
[
"Left RLN loops under AORTIC ARCH (ligamentum arteriosum attachment point)",
"Right RLN loops under RIGHT SUBCLAVIAN artery — shorter course",
"Left RLN travels 25–30 cm in chest — passes hilar lymph nodes, aortic arch, PA",
"Causes of LEFT RLN palsy: Lung cancer (MC), aortic aneurysm, mediastinal mass, thyroid goitre",
"Causes of RIGHT RLN palsy: Thyroid surgery (MC), subclavian artery pathology",
"Unilateral RLN palsy: hoarseness, aspiration, bovine cough",
"Bilateral RLN palsy: STRIDOR + respiratory distress (emergency tracheostomy)",
],
C.red);
pearlSlide(7,
"RLN Palsy — The Long Intrathoracic Left RLN Course Explains Everything",
"New hoarseness in a smoker = left RLN palsy until proven otherwise. Left vocal cord immobile in paramedian position = PCA paralysed (only abductor). Bovine (non-explosive) cough = cannot build up subglottic pressure (glottic incompetence). Ortner syndrome = cardiovocal hoarseness from aortic/cardiac enlargement compressing left RLN.",
"The left RLN loops under the AORTIC ARCH — this is why any large mediastinal structure (lung cancer, aortic aneurysm, lymphoma) causes left RLN palsy. The right RLN loops under the subclavian artery → right RLN palsy = think thyroid/neck pathology. RLN innervates ALL intrinsic muscles EXCEPT cricothyroid → paralysis = cord adducted (PCA = only abductor is lost).",
"MCQ: Most common cause of left RLN palsy = Lung cancer (hilar). Most common cause of bilateral RLN palsy = Thyroid surgery. Cord position in RLN palsy = paramedian (adducted). Management: voice therapy, injection medialization, or thyroplasty. Bilateral palsy = tracheostomy if stridor present.",
C.red);
// ═══════════════════════════════════════════════════════════════════════════
// FINAL SUMMARY SLIDE
// ═══════════════════════════════════════════════════════════════════════════
{
const slide = pres.addSlide();
darkBg(slide, C.gold);
slide.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 0.45, h: 5.625, fill: { color: C.gold } });
slide.addText("SUMMARY — ANATOMY EXPLAINS PATHOLOGY", {
x: 0.65, y: 0.2, w: 9.1, h: 0.65,
fontSize: 18, bold: true, color: C.gold, fontFace: "Calibri",
});
const summaryRows = [
["Case", "Condition", "Anatomical Key", "Clinical Hook"],
["1", "Glue Ear", "Child's Eustachian tube: short, horizontal", "Horizontal tube + adenoids → poor drainage → fluid"],
["2", "Cholesteatoma", "Pars flaccida lacks middle fibrous layer", "Weak TM → epithelium invades attic → bone erosion"],
["3", "Epistaxis", "Kiesselbach's plexus / Woodruff's plexus", "Anterior = Little's area; Posterior = sphenopalatine artery"],
["4", "Orbital complication", "Lamina papyracea = paper-thin orbital wall", "Ethmoid sinusitis → subperiosteal abscess through 0.2 mm bone"],
["5", "Quinsy", "Peritonsillar space + medial pterygoid", "Uvula deviates AWAY; trismus = pterygoid spasm"],
["6", "Epiglottitis", "Supraglottis: loose tissue, no rigid constraint", "Unconstrained oedema → thumb sign → airway emergency"],
["7", "RLN Palsy", "Left RLN loops under aortic arch (30 cm)", "Lung cancer → left RLN compression → hoarseness"],
];
// Mini table
const tdata = summaryRows.map(row => row.map(cell => ({
text: cell,
options: { fontSize: 8.5, fontFace: "Calibri", color: summaryRows[0] === row ? C.navy : C.white, bold: summaryRows[0] === row }
})));
slide.addTable(summaryRows, {
x: 0.6, y: 1.0, w: 9.2, h: 4.3,
colW: [0.5, 1.6, 2.8, 4.3],
rowH: 0.5,
fill: { color: "1A2A3A" },
color: C.white,
fontSize: 8.5,
fontFace: "Calibri",
border: { type: "solid", pt: 0.5, color: C.mid },
align: "left",
valign: "middle",
autoPage: false,
});
slide.addText("Sources: Cummings Otolaryngology · Scott-Brown's Otorhinolaryngology · K.J. Lee's Essential Otolaryngology · Gray's Anatomy for Students · Miller's Anesthesia 10e", {
x: 0.6, y: 5.35, w: 9.1, h: 0.25,
fontSize: 7, italic: true, color: C.mid, fontFace: "Calibri",
});
}
// ── OUTPUT ────────────────────────────────────────────────────────────────────
const OUT = "/home/daytona/workspace/ent-cases/ENT_Clinical_Cases_Anatomy_Pathology.pptx";
pres.writeFile({ fileName: OUT }).then(() => {
console.log("PPTX created:", OUT);
}).catch(err => {
console.error("Error:", err);
process.exit(1);
});
cd /home/daytona/workspace/ent-cases && node build_cases.js 2>&1
cd /home/daytona/workspace/ent-cases && sed -i \ 's/"1A6FA833"/"1A6FA8"/g; s/"…
ls -lh /home/daytona/workspace/ent-cases/ENT_Clinical_Cases_Anatomy_Pathology.pp…
ENT Clinical Cases Anatomy Pathology
Presentation · PPTX
| Case | Condition | Core Anatomical Concept |
|---|---|---|
| 1 | Glue Ear (OME) | Child's Eustachian tube is short and horizontal (10°) vs adult (45°) — poor drainage |
| 2 | Cholesteatoma (Unsafe CSOM) | Pars flaccida has no middle fibrous layer → squamous epithelium invades attic → bone-eroding mass |
| 3 | Epistaxis (Anterior + Posterior) | Kiesselbach's plexus (Little's area) vs Woodruff's plexus — anatomy determines severity and treatment |
| 4 | Acute Sinusitis → Orbital Abscess | Lamina papyracea = 0.2 mm thin ethmoid-orbit wall — Chandler's staging explained |
| 5 | Quinsy (Peritonsillar Abscess) | Peritonsillar space between capsule and superior constrictor — uvula deviation, trismus all anatomy-driven |
| 6 | Epiglottitis | Supraglottis has loose connective tissue + no rigid constraints → unconstrained rapid oedema (vs croup = subglottis bounded by cricoid) |
| 7 | Left RLN Palsy | Left RLN loops under aortic arch (~30 cm course) vs right RLN under subclavian — lung cancer causes left palsy |
Prepare the ppt of 1st response of chat which I earlier asked for pdf , i found ppt more easy and interesting to go with
ls /home/daytona/workspace/ent-anatomy/images/ && ls /home/daytona/workspace/ent…
Retry
ls /home/daytona/workspace/ent-anatomy/images/ && node --version
~/ent-anatomy/build_ppt.js
const pptxgen = require("pptxgenjs");
const fs = require("fs");
const path = require("path");
const pres = new pptxgen();
pres.layout = "LAYOUT_16x9";
pres.author = "Orris Medical AI";
pres.title = "ENT Anatomy — Complete MBBS Study Guide";
const IMG = "/home/daytona/workspace/ent-anatomy/images";
// ── PALETTE ──────────────────────────────────────────────────────────────────
const C = {
navy: "0D2137",
blue: "1A6FA8",
blueLt: "D6EAF8",
green: "1E8449",
greenLt: "D5F5E3",
red: "A93226",
redLt: "FADBD8",
gold: "D4AC0D",
goldLt: "FEF9E7",
dark: "1C2833",
mid: "5D6D7E",
offwh: "F2F3F4",
white: "FFFFFF",
light: "EAF4FC",
panel: "1A2A3A",
};
// ── HELPERS ───────────────────────────────────────────────────────────────────
function imgData(fn) {
const p = path.join(IMG, fn);
if (!fs.existsSync(p)) return null;
const ext = path.extname(fn).slice(1).toLowerCase();
const mime = ext === "png" ? "image/png" : "image/jpeg";
return `${mime};base64,${fs.readFileSync(p).toString("base64")}`;
}
// dark full-slide background
function darkBg(slide, accentBottom) {
slide.addShape(pres.ShapeType.rect, { x:0, y:0, w:10, h:5.625, fill:{color:C.navy} });
if (accentBottom)
slide.addShape(pres.ShapeType.rect, { x:0, y:5.3, w:10, h:0.325, fill:{color:accentBottom} });
}
// light background with coloured left bar
function lightBg(slide, bar) {
slide.addShape(pres.ShapeType.rect, { x:0, y:0, w:10, h:5.625, fill:{color:C.offwh} });
if (bar)
slide.addShape(pres.ShapeType.rect, { x:0, y:0, w:0.12, h:5.625, fill:{color:bar} });
}
// coloured title bar at top
function titleBar(slide, text, color) {
slide.addShape(pres.ShapeType.rect, { x:0, y:0, w:10, h:0.62, fill:{color:color} });
slide.addText(text, { x:0.18, y:0, w:9.64, h:0.62,
fontSize:14, bold:true, color:C.navy, fontFace:"Calibri", valign:"middle" });
}
// section divider (dark, big label)
function sectionDivider(label, sub, accent) {
const s = pres.addSlide();
darkBg(s, accent);
s.addShape(pres.ShapeType.rect, { x:0, y:0, w:0.5, h:5.625, fill:{color:accent} });
s.addText(label, { x:0.7, y:1.5, w:9, h:1.2,
fontSize:38, bold:true, color:C.white, fontFace:"Calibri" });
s.addText(sub, { x:0.7, y:2.8, w:9, h:0.7,
fontSize:17, italic:true, color:accent, fontFace:"Calibri" });
}
// two-panel slide
function twoPanel(title, accent,
leftHead, leftRows,
rightHead, rightRows) {
const s = pres.addSlide();
lightBg(s, accent);
titleBar(s, title, accent);
// left box
s.addShape(pres.ShapeType.rect, { x:0.18, y:0.75, w:4.6, h:4.7,
fill:{color:C.white}, line:{color:accent, pt:1.2} });
s.addText(leftHead, { x:0.28, y:0.82, w:4.4, h:0.38,
fontSize:11, bold:true, color:accent, fontFace:"Calibri" });
s.addText(leftRows.map((r,i)=>({text:r, options:{bullet:true, fontSize:9.8, color:C.dark,
fontFace:"Calibri", breakLine:i<leftRows.length-1}})),
{ x:0.3, y:1.28, w:4.38, h:4.05, valign:"top", wrap:true });
// right box
s.addShape(pres.ShapeType.rect, { x:5.22, y:0.75, w:4.6, h:4.7,
fill:{color:C.white}, line:{color:accent, pt:1.2} });
s.addText(rightHead, { x:5.32, y:0.82, w:4.4, h:0.38,
fontSize:11, bold:true, color:accent, fontFace:"Calibri" });
s.addText(rightRows.map((r,i)=>({text:r, options:{bullet:true, fontSize:9.8, color:C.dark,
fontFace:"Calibri", breakLine:i<rightRows.length-1}})),
{ x:5.34, y:1.28, w:4.38, h:4.05, valign:"top", wrap:true });
return s;
}
// table slide
function tableSlide(title, accent, headers, rows) {
const s = pres.addSlide();
lightBg(s, accent);
titleBar(s, title, accent);
const cw = Array(headers.length).fill((10 - 0.36) / headers.length);
const data = [headers, ...rows];
s.addTable(data, {
x:0.18, y:0.72, w:9.64,
colW: cw,
fontSize:9, fontFace:"Calibri",
border:{ type:"solid", pt:0.5, color:C.mid },
fill:{ color:C.white },
color:C.dark,
valign:"middle",
rowH:0.46,
autoPage:false,
});
// header row styling via first row fill trick — overlay
s.addShape(pres.ShapeType.rect, { x:0.18, y:0.72, w:9.64, h:0.46, fill:{color:C.navy} });
s.addText(headers.map((h,i)=>({ text:h,
options:{ fontSize:9.5, bold:true, color:C.white, fontFace:"Calibri",
breakLine: i<headers.length-1 ? false : false }})).reduce((acc,o,i)=>{
if(i>0) acc.push({text:" ", options:{fontSize:9}});
acc.push(o); return acc;
},[]),
{ x:0.18, y:0.72, w:9.64, h:0.46, valign:"middle", align:"left", margin:6,
fontSize:9.5, bold:true, color:C.white, fontFace:"Calibri" });
return s;
}
// mnemonic box slide
function mnemonicSlide(title, accent, mnemWord, lines, tip) {
const s = pres.addSlide();
lightBg(s, accent);
titleBar(s, title, accent);
// gold box
s.addShape(pres.ShapeType.rect, { x:0.5, y:0.8, w:9, h:4.55,
fill:{color:C.goldLt}, line:{color:C.gold, pt:2} });
s.addText("★ MNEMONIC: " + mnemWord, { x:0.6, y:0.95, w:8.8, h:0.6,
fontSize:17, bold:true, color:"8B6914", fontFace:"Calibri", align:"center" });
s.addShape(pres.ShapeType.line, { x:0.7, y:1.6, w:8.6, h:0,
line:{color:C.gold, pt:1} });
s.addText(lines.map((l,i)=>({text:l,
options:{bullet:true, fontSize:12.5, color:C.dark, fontFace:"Calibri",
breakLine:i<lines.length-1}})),
{ x:0.8, y:1.7, w:8.4, h:2.8, valign:"top", wrap:true });
if (tip) {
s.addShape(pres.ShapeType.rect, { x:0.5, y:4.8, w:9, h:0.55,
fill:{color:C.light}, line:{color:C.blue, pt:0.8} });
s.addText("💡 Tip: " + tip, { x:0.6, y:4.8, w:8.8, h:0.55,
fontSize:10, bold:true, color:C.blue, fontFace:"Calibri", valign:"middle" });
}
return s;
}
// info box slide
function infoSlide(title, accent, boxTitle, bullets) {
const s = pres.addSlide();
lightBg(s, accent);
titleBar(s, title, accent);
const ltColor = accent === C.blue ? C.blueLt : accent === C.green ? C.greenLt : accent === C.red ? C.redLt : C.goldLt;
s.addShape(pres.ShapeType.rect, { x:0.18, y:0.75, w:9.64, h:4.65,
fill:{color:ltColor}, line:{color:accent, pt:1.5} });
s.addText(boxTitle, { x:0.3, y:0.82, w:9.4, h:0.45,
fontSize:13, bold:true, color:accent, fontFace:"Calibri" });
s.addText(bullets.map((b,i)=>({text:b,
options:{bullet:true, fontSize:11, color:C.dark, fontFace:"Calibri",
breakLine:i<bullets.length-1}})),
{ x:0.32, y:1.35, w:9.3, h:3.95, valign:"top", wrap:true });
return s;
}
// image + annotation slide
function imgAnnotSlide(title, accent, imgFile, caption, annotHead, annotBullets) {
const s = pres.addSlide();
lightBg(s, accent);
titleBar(s, title, accent);
const data = imgData(imgFile);
if (data) s.addImage({ data, x:0.18, y:0.72, w:5.4, h:3.9 });
s.addText(caption, { x:0.18, y:4.66, w:5.4, h:0.5,
fontSize:7.5, italic:true, color:C.mid, fontFace:"Calibri", align:"center" });
// right panel
s.addShape(pres.ShapeType.rect, { x:5.75, y:0.72, w:4.07, h:4.65,
fill:{color:C.light}, line:{color:accent, pt:1.2} });
s.addText(annotHead, { x:5.85, y:0.79, w:3.87, h:0.42,
fontSize:11, bold:true, color:accent, fontFace:"Calibri" });
s.addText(annotBullets.map((b,i)=>({text:b,
options:{bullet:true, fontSize:9.5, color:C.dark, fontFace:"Calibri",
breakLine:i<annotBullets.length-1}})),
{ x:5.87, y:1.28, w:3.85, h:4.0, valign:"top", wrap:true });
return s;
}
// exam tip slide
function tipSlide(title, accent, tips) {
const s = pres.addSlide();
darkBg(s, accent);
s.addShape(pres.ShapeType.rect, { x:0, y:0, w:0.45, h:5.625, fill:{color:accent} });
s.addText(title, { x:0.65, y:0.25, w:9.1, h:0.65,
fontSize:18, bold:true, color:accent, fontFace:"Calibri" });
tips.forEach((tip,i) => {
const cy = 1.05 + i * 1.08;
s.addShape(pres.ShapeType.rect, { x:0.65, y:cy, w:9.0, h:0.92,
fill:{color:C.panel}, line:{color:accent, pt:1} });
s.addShape(pres.ShapeType.rect, { x:0.65, y:cy, w:0.38, h:0.92, fill:{color:accent} });
s.addText((i+1).toString(), { x:0.65, y:cy, w:0.38, h:0.92,
fontSize:14, bold:true, color:C.navy, align:"center", valign:"middle", fontFace:"Calibri" });
s.addText(tip, { x:1.1, y:cy+0.05, w:8.45, h:0.82,
fontSize:10.5, color:C.white, fontFace:"Calibri", valign:"middle", wrap:true });
});
return s;
}
// ═══════════════════════════════════════════════════════════════════════════════
// SLIDE 1 — COVER
// ═══════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
darkBg(s);
// tri-colour strip
s.addShape(pres.ShapeType.rect, { x:0, y:0, w:3.33, h:0.2, fill:{color:C.blue} });
s.addShape(pres.ShapeType.rect, { x:3.33, y:0, w:3.33, h:0.2, fill:{color:C.green} });
s.addShape(pres.ShapeType.rect, { x:6.66, y:0, w:3.34, h:0.2, fill:{color:C.red} });
s.addText("ENT ANATOMY", { x:0.5, y:0.5, w:9, h:1.05,
fontSize:46, bold:true, color:C.white, fontFace:"Calibri", align:"center", charSpacing:3 });
s.addText("Complete Study Guide for MBBS", { x:0.5, y:1.65, w:9, h:0.6,
fontSize:20, italic:true, color:C.gold, fontFace:"Calibri", align:"center" });
// region badges
[{ t:"EAR", c:C.blue, x:1.0 }, { t:"NOSE", c:C.green, x:4.2 }, { t:"THROAT", c:C.red, x:7.1 }]
.forEach(r => {
s.addShape(pres.ShapeType.rect, { x:r.x, y:2.45, w:2.0, h:0.52,
fill:{color:r.c}, line:{color:r.c, pt:1} });
s.addText(r.t, { x:r.x, y:2.45, w:2.0, h:0.52,
fontSize:15, bold:true, color:C.white, align:"center", valign:"middle", fontFace:"Calibri" });
});
// section list
const items = [
"Section 1 — EAR: External Ear · TM · Ossicles · Middle Ear · Inner Ear · Blood & Nerve Supply",
"Section 2 — NOSE: External Nose · Nasal Cavity · Turbinates · Blood & Nerve Supply · Sinuses",
"Section 3 — THROAT: Pharynx · Waldeyer's Ring · Larynx · Cartilages · Muscles · Nerves",
"Section 4 — MNEMONICS: Memory Tricks · Cranial Nerves · Hearing Loss · Summary Charts",
"Section 5 — CLINICAL CORRELATIONS: 12 High-Yield Conditions",
];
s.addText(items.map((t,i)=>({ text:t,
options:{ bullet:true, fontSize:10.5, color:C.offwh, fontFace:"Calibri",
breakLine:i<items.length-1 }})),
{ x:0.7, y:3.12, w:8.6, h:2.25, valign:"top" });
s.addText("Sources: Cummings Otolaryngology · Scott-Brown's · K.J. Lee's Essential Otolaryngology · Gray's Anatomy for Students · Miller's Anesthesia 10e",
{ x:0.5, y:5.38, w:9, h:0.22,
fontSize:7, italic:true, color:C.mid, fontFace:"Calibri", align:"center" });
}
// ═══════════════════════════════════════════════════════════════════════════════
// SECTION 1 — EAR
// ═══════════════════════════════════════════════════════════════════════════════
sectionDivider("SECTION 1 — EAR", "External Ear · Tympanic Membrane · Ossicles · Inner Ear · Blood & Nerve Supply", C.blue);
// Overview image slide
imgAnnotSlide(
"Section 1 — ENT Anatomy Overview",
C.blue,
"ent_fig_airway_overview.png",
"Fig 1.1 — Nasal cavities, pharynx, larynx and trachea (Gray's Anatomy for Students)",
"What This Slide Shows",
[
"Nasal cavity continuous with nasopharynx via choanae",
"Oral cavity → oropharynx → laryngopharynx",
"Larynx sits anterior to pharynx (C3–C6)",
"Trachea anterior to oesophagus — key surgical landmark",
"Epiglottis covers laryngeal inlet during swallowing",
"Hyoid bone suspends larynx from floor of mouth",
]
);
// 1.1 External Ear
twoPanel(
"1.1 External Ear — Auricle & External Auditory Canal (EAC)",
C.blue,
"Auricle (Pinna)",
[
"Elastic cartilage framework + keratinising squamous epithelium",
"Perichondrium: tightly bound on lateral side, loosely on medial side",
"Lobule = no cartilage (only fat) — why ear piercing safe here",
"Parts: Helix, antihelix, concha, tragus, antitragus, lobule, triangular fossa, scaphoid fossa",
"Blood supply: Superficial temporal art (anterior) + Posterior auricular art (posterior)",
"Nerve supply: Auriculotemporal (V3) anterior, Great auricular (C2,C3) posterior + Arnold's nerve (X) in EAC",
],
"External Auditory Canal (EAC)",
[
"Length ~2.5 cm in adults. S-shaped canal",
"Lateral 1/3 = CARTILAGINOUS: hair follicles, sebaceous & apocrine glands (cerumen produced here)",
"Medial 2/3 = BONY: thin squamous epithelium tightly adherent, NO glands or hair",
"Isthmus = narrowest point at bony-cartilaginous junction",
"Cerumen: hydrophobic, slightly acidic pH 6.0–6.5; self-cleaning via centrifugal migration",
"Fissures of Santorini: slits in cartilage → spread of infection/tumour to parotid",
"Foramen of Huschke: anterior bony canal defect → parotid disease spread",
]
);
// 1.2 Tympanic Membrane
infoSlide(
"1.2 Tympanic Membrane (Eardrum)",
C.blue,
"Structure, Landmarks & Clinical Significance",
[
"Pars tensa (larger, inferior): 3 layers — outer squamous epithelium · middle fibrous (circular + radial fibres) · inner mucosal layer",
"Pars flaccida / Shrapnell's membrane (superior, small): lacks middle fibrous layer → WEAKEST part of TM → site of cholesteatoma formation",
"Umbo: most depressed central point where handle of malleus attaches — visible on otoscopy",
"Cone of light: triangular light reflex at 5 o'clock (right ear) / 7 o'clock (left ear)",
"Annulus: thickened fibrocartilaginous ring anchoring TM to bony EAC",
"SAFE CSOM = central (pars tensa) perforation. UNSAFE CSOM = attic (pars flaccida) perforation + cholesteatoma",
"Normal TM: pearly grey, translucent. Dull/retracted = OME. Amber fluid level = glue ear. Red bulging = acute otitis media",
]
);
mnemonicSlide(
"1.2 — Tympanic Membrane Memory Tricks",
C.blue,
"Safe vs Unsafe CSOM",
[
"SAFE = Central perforation = Safe = Pars Tensa = No cholesteatoma = Medical treatment possible",
"UNSAFE = Attic (pars flaccida) perforation = Unsafe = Always needs surgery",
"Cone of light mnemonic: 'Right 5, Left 7' (clock positions)",
"Layers of pars tensa: 'Squamous-Fibrous-Mucous' = SFM = 'Some Fancy Music'",
],
"Pars flaccida = no middle fibrous layer → cannot resist retraction → allows epithelial invasion = cholesteatoma"
);
// 1.3 Middle Ear
tableSlide(
"1.3 Middle Ear — Parts, Ossicles & Muscles",
C.blue,
["STRUCTURE", "KEY FACTS", "CLINICAL RELEVANCE"],
[
["Epitympanum (Attic)", "Superior to TM; contains head of malleus + body of incus", "MC site for cholesteatoma formation"],
["Mesotympanum", "Level of TM; all ossicles + oval & round windows + facial nerve horizontal segment", "Facial nerve runs here — vulnerable in surgery"],
["Hypotympanum", "Below TM; floor overlies jugular bulb", "High jugular bulb → pulsatile tinnitus"],
["Malleus (Hammer)", "Largest ossicle; handle (manubrium) embedded in TM", "Manubrium visible on otoscopy as pale streak"],
["Incus (Anvil)", "Body + long process + lenticular process", "Long process = MOST VULNERABLE ossicle (single nutrient vessel)"],
["Stapes (Stirrup)", "Smallest bone in body; footplate sits in oval window", "Footplate fixation = otosclerosis → conductive HL"],
["Tensor tympani", "Nerve: V3 (medial pterygoid nerve). Action: pulls malleus medially", "T=T mnemonic: Tensor = Trigeminal"],
["Stapedius", "Nerve: CN VII (facial). Action: acoustic reflex — dampens stapes", "S=S mnemonic: Stapedius = Seven. Loss = facial palsy sign"],
]
);
mnemonicSlide(
"1.3 — Ossicle & Middle Ear Muscle Mnemonics",
C.blue,
"MIS + T=T + S=S",
[
"Ossicle order: M→I→S = Malleus → Incus → Stapes (sound travels laterally to medially)",
"Tensor tympani = Trigeminal (V3) = T=T",
"Stapedius = Seven (CN VII) = S=S",
"Most vulnerable ossicle = INCUS long process (single nutrient vessel, no collateral circulation)",
"Eustachian tube opens by: Levator veli palatini + Tensor veli palatini during swallowing/yawning",
],
"Acoustic reflex (stapedius) tested in tympanometry — loss of stapedius reflex = early sign of CN VII palsy!"
);
// 1.4 Eustachian Tube
infoSlide(
"1.4 Eustachian (Pharyngotympanic) Tube",
C.blue,
"Structure, Function & Clinical Importance",
[
"Length: 35–40 mm. Runs at 45° in adults, ~10° in children (nearly horizontal)",
"Medial 2/3 = cartilaginous (normally closed). Lateral 1/3 = bony (always open)",
"Function: ventilation + pressure equalisation of middle ear; drainage of middle ear secretions",
"Opens during: swallowing, yawning, sneezing (tensor & levator veli palatini dilate it)",
"Children's tube: shorter + more horizontal + poorly supported cartilage → poor drainage → glue ear (OME)",
"Adenoid hypertrophy physically blocks nasopharyngeal ostium → recurrent ear infections in children",
"Isthmus = narrowest point at bony-cartilaginous junction",
"Clinical: Eustachian tube dysfunction → negative middle ear pressure → TM retraction → OME (glue ear)",
]
);
// 1.5 Inner Ear
tableSlide(
"1.5 Inner Ear — Cochlea, Vestibular Apparatus & Key Concepts",
C.blue,
["STRUCTURE", "FUNCTION", "KEY DETAIL"],
[
["Cochlea (2¾ turns)", "Hearing", "Scala vestibuli (perilymph, top) · Scala media (endolymph, middle) · Scala tympani (perilymph, bottom)"],
["Organ of Corti", "Primary sensory organ of hearing", "Sits on basilar membrane in scala media. 1 row inner hair cells (IHC) + 3 rows outer hair cells (OHC). IHC=sensory; OHC=amplification"],
["Basilar membrane", "Tonotopy: frequency map", "High frequency = BASE (near oval window). Low frequency = APEX. Remember: 'BASE = Bass but HIGH freq'!"],
["Reissner's membrane", "Separates scala vestibuli from scala media", "Maintains endolymph composition"],
["Utricle & Saccule", "Linear acceleration + gravity (static equilibrium)", "Contain macula with otoliths (calcium carbonate crystals). BPPV = dislodged otoconia from utricle"],
["Semicircular Canals (3)", "Angular/rotational acceleration", "Lateral, Superior, Posterior. Ampulla = crista + cupula. Caloric test uses lateral SCC"],
["Endolymph", "Fills: scala media, SCC, utricle, saccule", "K⁺ rich (like intracellular fluid). Produced by stria vascularis. Reabsorbed by endolymphatic sac"],
["Perilymph", "Fills: scala vestibuli + scala tympani", "Na⁺ rich (like CSF/extracellular fluid). Continuous with CSF via cochlear aqueduct"],
]
);
mnemonicSlide(
"1.5 — Inner Ear Memory Tricks",
C.blue,
"VMT (Scalae) + BASE = High Freq",
[
"Three scalae: V-M-T = Vestibuli (perilymph) · Media (endolymph) · Tympani (perilymph)",
"'VMT = Very Musical Tones!' — top to bottom: Vestibuli, Media, Tympani",
"ENDOLYMPH = K⁺ rich = fills Endolymphatic duct system (scala Media, SCC, utricle/saccule)",
"PERILYMPH = Na⁺ rich = fills Periphery (scala Vestibuli + Tympani)",
"BASE of cochlea = near oval window = HIGH frequency processing (violin sounds)",
"APEX of cochlea = far from oval window = LOW frequency (bass sounds)",
"BPPV = otoconia from UTRICLE falls into POSTERIOR SCC → brief positional vertigo (Dix-Hallpike test +ve)",
],
"Exam trap: 'Base of cochlea = bass sounds?' NO! Base = HIGH frequency! This is the most common MCQ mistake."
);
// 1.6 Blood & Nerve Supply
tableSlide(
"1.6 Blood Supply & Nerve Supply of the Ear",
C.blue,
["REGION", "ARTERY", "VEIN / NERVE"],
[
["Auricle (anterior)", "Superficial temporal artery (ECA branch)", "Auriculotemporal nerve (V3) — sensory"],
["Auricle (posterior)", "Posterior auricular artery (ECA branch)", "Great auricular nerve (C2, C3)"],
["EAC + TM (outer layer)", "Deep auricular artery (from maxillary art.)", "Auriculotemporal (V3) + Arnold's nerve (vagus X) → cough reflex"],
["Middle ear", "Anterior tympanic (maxillary) + Stylomastoid (post. auricular) arteries", "Tympanic plexus = Jacobson's nerve (branch of IX)"],
["Inner ear (labyrinth)", "Labyrinthine artery — from AICA (basilar artery)", "Vestibulocochlear nerve CN VIII"],
["Cochlear blood supply", "AICA → labyrinthine artery → spiral modiolar artery", "CN VIII (cochlear division): bipolar neurons in spiral ganglion"],
["Mastoid air cells", "Mastoid branch of occipital + posterior auricular arteries", "Venous drainage to sigmoid sinus"],
]
);
tipSlide("Section 1 — EAR: High-Yield Exam Tips", C.blue, [
"Arnold's nerve (auricular branch of vagus X) in EAC → stimulation causes cough reflex — explains why ear syringing causes coughing and why some patients with lung cancer refer ear pain",
"Stapedius reflex (CN VII) is tested in tympanometry. Absent stapedius reflex = early sign of facial nerve palsy, even before visible facial weakness",
"Inner ear blood supply from labyrinthine artery (AICA) is an END ARTERY — no collaterals. Sudden SNHL from labyrinthine infarction is a medical emergency (may be first sign of posterior circulation stroke)",
"Most vulnerable ossicle = Long process of INCUS (single nutrient vessel). Most common ossicular disruption in trauma = incudostapedial joint",
]);
// ═══════════════════════════════════════════════════════════════════════════════
// SECTION 2 — NOSE
// ═══════════════════════════════════════════════════════════════════════════════
sectionDivider("SECTION 2 — NOSE", "External Nose · Nasal Cavity · Turbinates · Sinuses · Blood & Nerve Supply", C.green);
// 2.1 External Nose
infoSlide(
"2.1 External Nose — Skeleton & Framework",
C.green,
"Bony + Cartilaginous Framework (Upper → Lower)",
[
"Upper 1/3 (BONY): Paired nasal bones articulate with frontal bone (nasofrontal suture) superiorly and with maxilla laterally",
"Middle 1/3: Upper lateral cartilages (ULC) — attached to nasal bones above, to quadrilateral septal cartilage medially",
"Lower 1/3: Lower lateral cartilages (LLC / alar cartilages) — medial crura form columella, lateral crura form ala nasi",
"Keystone area = junction of nasal bones + ULC — disruption here causes saddle-nose deformity (rhinoplasty complication)",
"Nasal valve = angle between ULC and nasal septum (~10–15°) — narrowest functional point of nasal airway (not the bony isthmus)",
"Rhinoplasty terms: dorsum, tip, columella, ala, radix (root), nasion (bridge), philtrum (below nose)",
]
);
// 2.2 Nasal Cavity
tableSlide(
"2.2 Nasal Cavity — Walls, Epithelium & Key Boundaries",
C.green,
["WALL / AREA", "FORMED BY", "CLINICAL NOTE"],
[
["Floor", "Anterior 3/4: palatine process of maxilla. Posterior 1/4: horizontal plate of palatine bone", "Incisive canal (~12 mm behind ant. nares) contains nasopalatine nerve + greater palatine artery"],
["Roof", "Nasal bones (ant.) → cribriform plate of ethmoid (middle) → body of sphenoid (post.)", "Slopes downward ant.→post. — critical in FESS to avoid skull base injury"],
["Medial wall (septum) — bony", "Perpendicular plate of ethmoid (upper) + Vomer (lower posterior)", "Septal deviation at junctions of cartilage-bone"],
["Medial wall — cartilaginous", "Quadrilateral (septal) cartilage — anterior", "Anterior dislocation of septal cartilage = common cause of obstruction"],
["Lateral wall", "Most complex: turbinates, meatal openings, sinus ostia", "See turbinate table — key for FESS"],
["Vestibule epithelium", "Squamous (skin-like) — most anterior nasal cavity", "Contains vibrissae (nasal hairs) — first-line filter"],
["Olfactory epithelium", "Superior septum, superior turbinate, upper middle turbinate", "CN I fibres pass through cribriform plate — at risk in skull base fractures"],
["Respiratory epithelium", "Remainder of nasal cavity", "Pseudostratified ciliated columnar — mucociliary clearance"],
]
);
mnemonicSlide(
"2.2 — Nasal Septum Mnemonic",
C.green,
"PEV-C (Perpendicular · Ethmoid · Vomer · Cartilage)",
[
"P = Perpendicular plate of ethmoid (upper-posterior bony septum)",
"E = Ethmoid — same as above (reminder)",
"V = Vomer (lower-posterior bony septum)",
"C = Cartilage = Quadrilateral septal cartilage (anterior)",
"Septal perforations: cocaine abuse (anterior cartilage), syphilis/Wegener's (posterior bony — saddle nose)",
"Kiesselbach's area on ANTERIOR septum over cartilage = most common epistaxis site",
],
"Septal deviations most common at junctions: cartilage-vomer junction and perpendicular plate-vomer junction"
);
// 2.3 Turbinates
tableSlide(
"2.3 Turbinates (Conchae) — Meatuses & Sinus Drainage",
C.green,
["TURBINATE", "MEATUS BELOW", "WHAT DRAINS HERE", "CLINICAL NOTE"],
[
["Superior turbinate", "Superior meatus", "Posterior ethmoidal air cells", "Sphenoethmoidal recess (above superior turbinate) drains SPHENOID sinus"],
["Middle turbinate", "Middle meatus", "Frontal sinus (via nasofrontal duct → infundibulum), Maxillary sinus (via infundibulum), Anterior ethmoidal cells", "OSTIOMEATAL COMPLEX (OMC) — most important drainage site. Target of FESS."],
["Inferior turbinate", "Inferior meatus", "Nasolacrimal duct (tears drain here)", "Why nose runs when crying! Largest turbinate; commonest site for turbinate hypertrophy"],
["Above superior turbinate", "Sphenoethmoidal recess", "Sphenoid sinus directly", "Posterior epistaxis area; sphenopalatine foramen opens into lateral wall here"],
]
);
mnemonicSlide(
"2.3 — Turbinate & Drainage Mnemonic",
C.green,
"Middle Meatus = Maximum Drainage",
[
"INFERIOR MEATUS → NasoLacrimal duct → 'I cry = Inferior'",
"MIDDLE MEATUS → Most sinuses (Maxillary + Frontal + Anterior Ethmoid) → 'M=Maximum drainage'",
"SUPERIOR MEATUS → Posterior ethmoids → 'S=Small amount, Posterior'",
"SPHENOETHMOIDAL RECESS → Sphenoid sinus → 'Above everything = Sphenoid above all'",
"OMC = Ostiomeatal Complex = Final common pathway for frontal + maxillary + anterior ethmoid drainage",
"OMC obstruction (polyp/oedema/deviation) → recurrent sinusitis → FESS target",
],
"MCQ: Nasolacrimal duct drains into INFERIOR meatus. Sphenoid drains into sphenoethmoidal recess (NOT the superior meatus directly)"
);
// 2.4 Blood Supply
twoPanel(
"2.4 Blood Supply of the Nasal Cavity — Epistaxis Anatomy",
C.green,
"Arterial Supply (ICA + ECA Dual Supply)",
[
"Anterior ethmoidal artery — from ophthalmic art. (ICA) — anterior superior septum + lateral wall",
"Posterior ethmoidal artery — from ophthalmic art. (ICA) — posterior superior septum",
"Sphenopalatine artery — from maxillary art. (ECA) — main nasal artery; posterior septum + lateral wall",
"Greater palatine artery — from maxillary art. (ECA) — inferior anterior septum",
"Superior labial artery — from facial art. (ECA) — anterior septum (columella area)",
"KIESSELBACH'S PLEXUS = all 5 anastomose on anteroinferior septum = LITTLE'S AREA = 90% of nosebleeds",
"WOODRUFF'S PLEXUS = posterior lateral nasal wall = posterior epistaxis (elderly, hypertensive)",
],
"Clinical Epistaxis Pearls",
[
"Anterior epistaxis (80–90%): Kiesselbach's plexus, easily visible and controllable",
"Posterior epistaxis (10–20%): Woodruff's plexus / sphenopalatine artery, blood flows to throat",
"Treatment ladder: Pinch → Silver nitrate cautery → BIPP packing → Posterior pack → Sphenopalatine artery ligation/embolisation",
"Sphenopalatine foramen: at posterior end of MIDDLE turbinate (surgical landmark for ligation)",
"Hereditary haemorrhagic telangiectasia (HHT/Osler-Weber-Rendu) = recurrent epistaxis + telangiectases",
]
);
// 2.5 Nerve Supply
infoSlide(
"2.5 Nerve Supply of the Nasal Cavity",
C.green,
"Sensory, Autonomic & Olfactory Innervation",
[
"CN I (Olfactory): Olfactory epithelium — superior septum + superior turbinate + upper middle turbinate. Fibres pass through cribriform plate → olfactory bulb. Anosmia in cribriform plate fractures.",
"V1 (Ophthalmic): Anterior ethmoidal nerve → anterior septum + lateral wall (ant. third). Also supplies tip of nose (external nasal branch).",
"V2 (Maxillary): Posterolateral nasal branches via sphenopalatine ganglion → posterior septum + lateral wall (post. two-thirds). Nasopalatine nerve → anterior hard palate.",
"Parasympathetic (secretomotor): Greater superficial petrosal nerve → vidian nerve → sphenopalatine ganglion → nasal glands. Regulates NASAL SECRETIONS. Target of vidian neurectomy in vasomotor rhinitis.",
"Sympathetic (vasoconstrictor): Deep petrosal nerve → vidian nerve → sphenopalatine ganglion → nasal mucosa. Regulates VASCULAR TONE & turbinate congestion.",
"Sphenopalatine ganglion = 'ganglion of hay fever' — postganglionic parasympathetic to nasal glands. Can be blocked for cluster headache / allergic rhinitis.",
]
);
// 2.6 Paranasal Sinuses
tableSlide(
"2.6 Paranasal Sinuses — Development, Drainage & Key Relations",
C.green,
["SINUS", "AT BIRTH?", "FULL SIZE", "DRAINS INTO", "KEY RELATIONS / CLINICAL"],
[
["Maxillary (Antrum of Highmore)", "YES (small)", "18 years", "Middle meatus via infundibulum (HIGH ostium = poor gravity drainage)", "Floor = upper molar roots; Roof = orbital floor + infraorbital nerve; Post wall = pterygomaxillary fissure"],
["Ethmoid (air cells)", "YES (small)", "12 years", "Anterior cells → middle meatus. Posterior cells → superior meatus", "Lamina papyracea = paper-thin orbital wall (0.2 mm) — breached in trauma → orbital emphysema"],
["Frontal", "NO (appears ~2 yr)", "Puberty", "Nasofrontal duct → middle meatus via infundibulum", "Pott's puffy tumour = subperiosteal forehead abscess. Intracranial complications: meningitis, epidural abscess"],
["Sphenoid", "NO (appears ~3 yr)", "Puberty", "Sphenoethmoidal recess (above superior turbinate)", "Adjacent: pituitary (roof), optic nerve (lateral wall), carotid artery (lateral wall), cavernous sinus. Trans-sphenoidal surgery."],
]
);
mnemonicSlide(
"2.6 — Paranasal Sinuses Development Mnemonic",
C.green,
"'Max & Eth at Birth; Sph at 3; Front at 2 but Full at Puberty'",
[
"Maxillary + Ethmoid = present at BIRTH (both small, grow postnatally)",
"Sphenoid = appears ~3 years post birth",
"Frontal = appears ~2 years post birth, but fully formed only at puberty",
"Most common sinus infected = MAXILLARY (largest, poorest drainage due to high ostium)",
"Most dangerous sinus to operate on = SPHENOID (pituitary + optic + carotid + cavernous sinus all adjacent)",
"Most common sinus causing orbital complications = ETHMOID (lamina papyracea = paper thin)",
],
"Exam: Sinuses present at birth = Maxillary + Ethmoid. Sinuses developing post-birth = Frontal + Sphenoid"
);
tipSlide("Section 2 — NOSE: High-Yield Exam Tips", C.green, [
"Sphenopalatine artery = the KEY artery for posterior epistaxis. It enters the nasal cavity through the sphenopalatine foramen, found behind the POSTERIOR END OF THE MIDDLE TURBINATE (not inferior!) — critical surgical landmark",
"Lamina papyracea (ethmoid medial wall = orbital medial wall) is the thinnest bone in the body (0.2 mm) — sinusitis or trauma → orbital complications. Chandler's staging describes orbital spread: I (oedema) → V (cavernous sinus thrombosis)",
"OMC (Ostiomeatal Complex) = the anatomical target of FESS. It drains maxillary + frontal + anterior ethmoid sinuses. Blockage here causes recurrent sinusitis despite treatment",
"The maxillary sinus ostium is ANATOMICALLY HIGH on the medial wall — gravity cannot drain a maxillary sinus infection unless the patient tilts their head. Antral washout bypasses this by going through the inferior meatus",
]);
// ═══════════════════════════════════════════════════════════════════════════════
// SECTION 3 — THROAT
// ═══════════════════════════════════════════════════════════════════════════════
sectionDivider("SECTION 3 — THROAT", "Pharynx · Waldeyer's Ring · Larynx · Cartilages · Muscles · Nerve Supply", C.red);
// Image slide
imgAnnotSlide(
"Section 3 — Sagittal Anatomy of Pharynx & Larynx",
C.red,
"ent_fig1_sagittal.png",
"Fig 3.1 — Sagittal section: oropharynx (uvula → hyoid), hypopharynx (hyoid → cricoid), trachea anterior to oesophagus (Miller's Anesthesia 10e)",
"Key Relationships to Memorise",
[
"Oropharynx: uvula → hyoid bone (C2–C3)",
"Hypopharynx: hyoid → cricoid (C3–C6)",
"Glottis = vocal cords + ant commissure + post interarytenoid area",
"Subglottis = 5 mm (ant.) / 10 mm (post.) below vocal cord apex",
"Trachea is ANTERIOR to oesophagus",
"Cricoid ring = only complete cartilaginous ring in airway",
"Sellick manoeuvre: press cricoid posteriorly to occlude oesophagus",
]
);
// 3.1 Pharynx
tableSlide(
"3.1 Pharynx — Three Parts, Boundaries & Key Contents",
C.red,
["PART", "EXTENT (VERTEBRAL)", "ANTERIOR OPENING", "KEY STRUCTURES"],
[
["Nasopharynx", "Base of skull → soft palate (C1–C2)", "Posterior choanae (nasal cavity)", "Adenoids (pharyngeal tonsil), Eustachian tube opening, Fossa of Rosenmuller (posterior to ET opening — site of nasopharyngeal carcinoma)"],
["Oropharynx", "Soft palate → upper border of epiglottis / hyoid (C2–C3)", "Oropharyngeal isthmus (from oral cavity)", "Palatine tonsils, vallecula, base of tongue (lingual tonsil), posterior pharyngeal wall"],
["Laryngopharynx (Hypopharynx)", "Hyoid bone → lower border of cricoid C6", "Laryngeal inlet (aditus laryngis)", "Pyriform fossae (lateral to larynx — foreign bodies lodge here), posterior cricoid area, cricopharyngeus (UOS)"],
]
);
// Pharyngeal muscles
tableSlide(
"3.1 — Pharyngeal Muscles & Nerve Supply",
C.red,
["MUSCLE", "LAYER", "NERVE", "ACTION", "SPECIAL NOTE"],
[
["Superior constrictor", "Outer circular", "CN X (vagus) via pharyngeal plexus", "Squeeze upper pharynx in swallowing", "Dehiscence between it and base of skull = Killian's dehiscence area"],
["Middle constrictor", "Outer circular", "CN X via pharyngeal plexus", "Squeeze middle pharynx", "Hyoid bone attachment"],
["Inferior constrictor", "Outer circular", "CN X via pharyngeal plexus (+ external SLN for cricothyroid part)", "Squeeze lower pharynx. Lower fibres = cricopharyngeus (UOS)", "Killian's dehiscence = between thyropharyngeus and cricopharyngeus → Zenker's diverticulum"],
["Stylopharyngeus", "Inner longitudinal", "CN IX (ONLY pharyngeal muscle!)", "Elevates pharynx + larynx", "MCQ FAVOURITE: only muscle supplied by CN IX"],
["Salpingopharyngeus", "Inner longitudinal", "CN X via pharyngeal plexus", "Elevates pharynx; opens ET", "From Eustachian tube cartilage → salpingopharyngeal fold"],
["Palatopharyngeus", "Inner longitudinal", "CN X via pharyngeal plexus", "Elevates pharynx + depresses soft palate", "Forms posterior tonsillar pillar"],
]
);
mnemonicSlide(
"3.1 — Pharynx Mnemonics",
C.red,
"NaO Hy-La Cri + Stylopharyngeus = Nine (CN IX)",
[
"Pharynx boundaries: Base skull → Soft palate (Naso) → Hyoid (Oro) → Cricoid (Laryngo)",
"NaO Hy-La Cri = 'Na Hyla Cri' — Nasopharynx, Oropharynx, Laryngopharynx",
"Stylopharyngeus = the ONLY pharyngeal muscle NOT supplied by vagus (CN X)",
"Stylopharyngeus = CN IX = 'Stylo = Nine' (9 letters in stylopharyngeus starts with 'S' = same as IX backwards joke!)",
"Killian's dehiscence = gap between thyropharyngeus (oblique) and cricopharyngeus (horizontal) fibres of inferior constrictor → Zenker's diverticulum herniation site",
],
"Exam: Which pharyngeal muscle is supplied by CN IX? = Stylopharyngeus. This comes up in almost every ENT MCQ paper!"
);
// 3.2 Waldeyer's Ring
tableSlide(
"3.2 Waldeyer's Ring — Tonsillar Tissue",
C.red,
["TONSIL", "NUMBER", "LOCATION", "CLINICAL IMPORTANCE"],
[
["Pharyngeal tonsil (Adenoids)", "1", "Roof + posterior wall of nasopharynx", "Enlargement → nasal obstruction + glue ear (blocks Eustachian tube) + snoring + obstructive sleep apnoea"],
["Tubal tonsils", "2 (one each side)", "Around Eustachian tube opening in nasopharynx", "Part of ring; less commonly enlarged"],
["Palatine tonsils", "2 (one each side)", "Tonsillar fossa between palatoglossal (ant. pillar) and palatopharyngeal (post. pillar) folds", "Tonsillitis, peritonsillar abscess (quinsy). ICA lies 2.5 cm posterolateral — risk in I&D"],
["Lingual tonsil", "1", "Base of tongue (posterior 1/3)", "Hypertrophy → snoring + dysphagia + difficult intubation"],
]
);
mnemonicSlide(
"3.2 — Waldeyer's Ring Mnemonic",
C.red,
"1 Pharyngeal + 2 Tubal + 2 Palatine + 1 Lingual = 6 Total",
[
"Ring = PTTL: Pharyngeal (1) + Tubal (2) + Tonsillar/Palatine (2) + Lingual (1)",
"Total = 6 tonsils forming the ring at entrance to aerodigestive tract",
"Peritonsillar abscess (Quinsy): pus between tonsil capsule and SUPERIOR CONSTRICTOR muscle",
"Uvula deviates AWAY from side of quinsy (contralateral) — due to unilateral swelling pushing it",
"Trismus in quinsy = medial pterygoid muscle irritation (lies just lateral to superior constrictor)",
"ICA lies only 2.5 cm posterolateral to tonsil — NEVER go too deep when draining a peritonsillar abscess!",
],
"MCQ: Quinsy = peritonsillar abscess. Uvula goes AWAY from pus. Trismus = medial pterygoid spasm. Danger space = parapharyngeal space → mediastinitis."
);
// 3.3 Larynx
infoSlide(
"3.3 Larynx — Overview & Extent",
C.red,
"Structure, Extent & Subdivisions",
[
"Extent: Tip of epiglottis (C3) → lower border of cricoid cartilage (C6) — suspended from hyoid bone by thyrohyoid membrane",
"Organ of phonation and guardian of the lower airway (prevents aspiration)",
"Supraglottis (C3–C5): laryngeal inlet → superior surface of true vocal cords. Contains epiglottis, aryepiglottic folds, false cords (vestibular folds), ventricle (sinus of Morgagni). RICH lymphatics → early nodal metastasis.",
"Glottis (C5): true vocal cords (vocalis muscle + vocal ligament + mucosa) + anterior commissure + posterior interarytenoid area. Rima glottidis = opening between cords. POOR lymphatics → late metastasis → best prognosis of laryngeal carcinomas.",
"Subglottis (C5–C6): 5 mm (anteriorly) to 10 mm (posteriorly) below vocal cord apex → lower border of cricoid. NO named structures. Trachea begins below.",
"Narrowest part in ADULTS = rima glottidis. Narrowest in CHILDREN = subglottis (cricoid ring) — why croup = subglottic narrowing = steeple sign on X-ray.",
]
);
// Cartilages
tableSlide(
"3.3.1 — Nine Cartilages of the Larynx",
C.red,
["CARTILAGE", "NUMBER", "TYPE", "KEY DESCRIPTION & CLINICAL"],
[
["Thyroid", "1 (unpaired)", "Hyaline", "Largest cartilage. Shield-shaped. Laryngeal prominence ('Adam's apple'). Superior cornu = landmark for SLN block. Calcifies with age."],
["Cricoid", "1 (unpaired)", "Hyaline — ONLY complete ring in airway", "Signet-ring shape (narrow anterior, wide posterior). Level C6. Sellick manoeuvre. Narrowest point in children."],
["Epiglottis", "1 (unpaired)", "Elastic (does NOT calcify)", "Leaf-shaped. Attached to thyroid cartilage via thyroepiglottic ligament. Vallecula = space between epiglottis and tongue base. Tip at C3."],
["Arytenoids", "2 (paired)", "Hyaline", "Pyramid-shaped. Vocal processes (attach vocal cords). Muscular processes (muscle attachments). Adduction/abduction of cords via arytenoid rotation."],
["Corniculate (of Santorini)", "2 (paired)", "Elastic", "Sit on apex of arytenoids. Form part of aryepiglottic fold. Visible as posterior mucosal bumps on laryngoscopy."],
["Cuneiform (of Wrisberg)", "2 (paired)", "Elastic", "Within aryepiglottic folds. Stiffen and support the fold."],
]
);
mnemonicSlide(
"3.3.1 — Laryngeal Cartilage Mnemonic",
C.red,
"3 Unpaired (TCE) + 3 Paired (ACC) = 9 Total",
[
"UNPAIRED (single, midline): Thyroid · Cricoid · Epiglottis",
"PAIRED (two each): Arytenoid · Corniculate · Cuneiform",
"Mnemonic: 'The Cute Elephant Always Comes Crawling' = T-C-E + A-C-C",
"Hyaline cartilages: Thyroid, Cricoid, Arytenoid (lower portion) — can calcify/ossify with age",
"Elastic cartilages: Epiglottis, Corniculate, Cuneiform, Arytenoid tips — do NOT calcify",
"Cricoid = only COMPLETE ring → narrow in children → site of subglottic stenosis + croup",
],
"Exam: How many cartilages in larynx? = 9. Unpaired = 3 (Thyroid, Cricoid, Epiglottis). Paired = 3 pairs (Arytenoid, Corniculate, Cuneiform)."
);
// Intrinsic muscles
tableSlide(
"3.3.2 — Intrinsic Muscles of the Larynx",
C.red,
["MUSCLE", "ACTION", "NERVE", "MNEMONIC"],
[
["Posterior cricoarytenoid (PCA)", "ONLY ABDUCTOR of vocal cords (opens rima glottidis for breathing)", "Recurrent laryngeal nerve (RLN)", "PCA = 'PAC-man that opens its mouth = opens glottis'"],
["Lateral cricoarytenoid (LCA)", "Adductor — closes glottis (phonation, coughing)", "RLN", "Lateral = closes Lateral/Lumen"],
["Transverse arytenoid (interarytenoid)", "Adductor — closes posterior glottis (only bilaterally innervated muscle)", "RLN (bilateral supply)", "Transverse = Together = closes"],
["Oblique arytenoid + aryepiglottic", "Adductor + narrows laryngeal inlet", "RLN", "Closes inlet like a purse-string"],
["Thyroarytenoid (vocalis portion)", "Shortens + relaxes vocal cords (lowers pitch)", "RLN", "Thyro = relaxes tension = lower tone"],
["Cricothyroid", "Elongates + TENSES vocal cords (raises pitch) — only external SLN muscle", "External branch of SLN (NOT RLN)", "EXCEPTION: Cricothyroid = external SLN"],
]
);
// Nerve supply with diagram
imgAnnotSlide(
"3.3.3 — Laryngeal Nerve Supply (RLN & SLN)",
C.red,
"ent_fig3_larynx_nerves.png",
"Fig 3.3 — RLN (motor to all intrinsic muscles except cricothyroid) and SLN branches: internal (sensory above cords) and external (cricothyroid motor). (Miller's Anesthesia 10e)",
"Laryngeal Nerve Summary",
[
"RLN (Recurrent Laryngeal Nerve): motor to ALL intrinsic muscles EXCEPT cricothyroid",
"RLN: sensory to larynx BELOW vocal cords + upper trachea",
"Left RLN: loops under aortic arch (~30 cm chest course)",
"Right RLN: loops under right subclavian artery (~10 cm)",
"External SLN: motor to cricothyroid + inferior pharyngeal constrictor",
"Internal SLN: sensory above vocal cords (supraglottis)",
"Bilateral RLN palsy → both PCAs paralysed → both cords adducted → STRIDOR + respiratory distress (emergency!)",
"Unilateral RLN palsy → hoarseness + bovine cough",
]
);
mnemonicSlide(
"3.3 — Larynx Master Mnemonics",
C.red,
"PCA opens + All others close + Exception = Cricothyroid",
[
"ONLY ABDUCTOR = Posterior Cricoarytenoid (PCA) = 'PCA is the Positive Cords Apart muscle'",
"ALL OTHER intrinsic muscles = ADDUCTORS (close glottis)",
"EXCEPTION: Cricothyroid = external SLN (not RLN). All others = RLN.",
"Bilateral RLN palsy: both PCAs paralysed → both cords adduct → stridor → tracheostomy needed",
"Unilateral RLN palsy: one cord in paramedian (adducted) position → hoarse voice + aspirations",
"Voice pitch: Cricothyroid TENSES cords = RAISES pitch. Thyroarytenoid RELAXES cords = LOWERS pitch.",
"RLN left loop: 'Left RLN goes Low — loops under aorta'. Right RLN = 'Recurves under Right subclavian'.",
],
"Exam trap: 'Cricothyroid is supplied by RLN?' = NO! External branch of SUPERIOR laryngeal nerve."
);
tipSlide("Section 3 — THROAT: High-Yield Exam Tips", C.red, [
"Stylopharyngeus = only pharyngeal muscle innervated by CN IX (all others = CN X via pharyngeal plexus). This is a near-constant MCQ. Stylopharyngeus is also the only muscle of the pharynx that ELEVATES it (longitudinal layer).",
"Left RLN has a long intrathoracic course (~30 cm, loops under aortic arch) → vulnerable to lung cancer, aortic aneurysm, mediastinal masses. Right RLN loops under right subclavian → vulnerable to thyroid/neck pathology. Bilateral RLN palsy = both PCAs lost = both cords adducted = stridor + emergency tracheostomy.",
"In children, the narrowest part of the airway is the SUBGLOTTIS (cricoid ring) — hence croup causes subglottic narrowing (steeple sign on AP neck X-ray). In adults, the narrowest part is the RIMA GLOTTIDIS.",
"Vallecula = space between base of tongue and epiglottis. Foreign bodies (especially coins in children) lodge here. LMA sits in vallecula. Epiglottis tip is visible in vallecula on direct laryngoscopy.",
]);
// ═══════════════════════════════════════════════════════════════════════════════
// SECTION 4 — MNEMONICS & SUMMARY CHARTS
// ═══════════════════════════════════════════════════════════════════════════════
sectionDivider("SECTION 4 — MNEMONICS & CHARTS", "Cranial Nerves in ENT · Hearing Loss · Summary Tables · Quick Recall", C.gold);
// Cranial Nerves in ENT
tableSlide(
"4.1 Cranial Nerves in ENT — Master Reference",
C.gold,
["CN", "NAME", "ENT ROLE", "HIGH-YIELD FACT"],
[
["I", "Olfactory", "Smell — olfactory mucosa (nasal roof, superior septum)", "Anosmia in cribriform plate fractures. Meningioma of olfactory groove."],
["V1", "Ophthalmic", "Anterior ethmoidal n → anterior nasal septum + lateral wall", "Corneal reflex. Herpes zoster ophthalmicus → nasal tip rash (Hutchinson's sign) → eye involvement likely."],
["V2", "Maxillary", "Posterior nasal septum, lateral wall, upper teeth, palate", "Maxillary sinusitis pain referred to upper teeth/cheek. Sphenopalatine ganglion block."],
["V3", "Mandibular", "Auriculotemporal n → EAC, TM, anterior auricle. Motor: tensor tympani, tensor veli palatini", "Referred otalgia from mandibular pathology (dental, TMJ)"],
["VII", "Facial", "Motor: face + stapedius. Secretomotor: lacrimal, nasal glands (via greater petrosal). Taste ant 2/3 tongue (chorda tympani)", "Runs through temporal bone (mastoid segment). Bell's palsy. Chorda tympani damaged in parotid/middle ear surgery."],
["VIII", "Vestibulocochlear", "Cochlear = hearing. Vestibular = balance", "BPPV, Meniere's, acoustic neuroma (CPA). Ototoxic drugs damage hair cells (aminoglycosides → outer hair cells first)."],
["IX", "Glossopharyngeal", "Taste post 1/3 tongue. Jacobson's n → middle ear sensory. Stylopharyngeus motor", "Jacobson's nerve = tympanic branch of CN IX. Glomus jugulare tumour. Carotid sinus reflex."],
["X", "Vagus", "Arnold's n → EAC. Pharyngeal plexus (motor). SLN + RLN → larynx. Palate elevation", "Arnold's nerve → cough on ear syringing. RLN palsy → hoarseness."],
["XI", "Accessory", "SCM + trapezius motor", "Neck dissection → CN XI at risk → shoulder drop + winging of scapula"],
["XII", "Hypoglossal", "Tongue motor", "Floor of mouth surgery / neck dissection risk. Unilateral palsy → tongue deviates TO affected side."],
]
);
// Hearing Loss
twoPanel(
"4.2 Conductive vs Sensorineural Hearing Loss — Quick Comparison",
C.gold,
"Conductive Hearing Loss (CHL)",
[
"Lesion: External ear, TM, ossicles, middle ear, Eustachian tube",
"Rinne test: NEGATIVE (BC > AC) — abnormal",
"Weber: Lateralises to AFFECTED (worse) ear",
"Max gap: Up to 60 dB air-bone gap",
"Causes: Wax, TM perforation, CSOM, ossicular disruption, otosclerosis, glue ear",
"Tympanometry: Type B (flat) = fluid. Type C = Eustachian dysfunction. Type As = stiff (otosclerosis). Type Ad = flaccid (ossicular disruption)",
"Treatment: Often surgical (grommet, myringoplasty, ossiculoplasty, stapedectomy)",
],
"Sensorineural Hearing Loss (SNHL)",
[
"Lesion: Cochlea (sensory) or auditory nerve (neural) or central pathway",
"Rinne test: POSITIVE (AC > BC) — but reduced overall",
"Weber: Lateralises to NORMAL (better) ear",
"No air-bone gap on audiogram",
"Causes: Presbycusis (ageing), noise-induced, Meniere's, acoustic neuroma, ototoxic drugs, meningitis, sudden SNHL",
"Ototoxic drugs: Aminoglycosides (gentamicin → vestibulotoxic; streptomycin/neomycin → cochleotoxic), loop diuretics (frusemide), cisplatin, quinine",
"Treatment: Hearing aids, cochlear implants (for severe/profound SNHL)",
]
);
mnemonicSlide(
"4.2 — Weber & Rinne Test Mnemonic",
C.gold,
"Weber goes to the BAD ear (CHL) or GOOD ear (SNHL)",
[
"RINNE NEGATIVE (BC > AC) = Conductive HL = the 'wrong' answer in the test = abnormal",
"RINNE POSITIVE (AC > BC) = Normal or SNHL (reduced overall in SNHL)",
"WEBER in CHL = goes to WORSE / AFFECTED ear (bone conduction still reaches that ear, ambient noise masked)",
"WEBER in SNHL = goes to BETTER / NORMAL ear (damaged cochlea can't even perceive bone conduction well)",
"Trick: 'In CHL, Weber goes to the Bad ear to see if BC can help it. In SNHL, Weber gives up on the bad ear.'",
"Absolute bone conduction (ABC) test = compares patient's BC to examiner's → tests cochlear reserve",
],
"Exam: Rinne Negative + Weber to affected ear = Conductive HL. Rinne Positive (reduced overall) + Weber to other ear = SNHL."
);
// Master Mnemonic Table
{
const s = pres.addSlide();
lightBg(s, C.gold);
titleBar(s, "4.3 Master Mnemonic Collection — All-in-One Reference", C.gold);
const mnData = [
["TOPIC", "MNEMONIC", "FULL FORM / TIP"],
["Ossicle order", "MIS", "Malleus → Incus → Stapes (lateral to medial)"],
["Middle ear muscles", "T=T, S=S", "Tensor tympani = Trigeminal (V3); Stapedius = Seven (CN VII)"],
["Kiesselbach's arteries", "ASGLS", "Anterior ethmoidal, Sphenopalatine, Greater palatine, Labial superior, Septal"],
["Nasal septum bones", "PEV-C", "Perpendicular plate of ethmoid · Ethmoid · Vomer · Cartilage"],
["Middle meatus drains most", "M = Maximum", "Frontal + Maxillary + Ant. ethmoid all drain here"],
["Sinus development at birth", "Max + Eth present; Front 2yr; Sphen 3yr", "Only Maxillary + Ethmoid at birth"],
["Pharynx boundaries", "Base→Softpalate→Hyoid→Cricoid", "Naso / Oro / Laryngopharynx"],
["Waldeyer's ring count", "1+2+2+1 = 6", "Pharyngeal + Tubal + Palatine + Lingual"],
["Laryngeal cartilages", "3 unpaired TCE + 3 paired ACC = 9", "Thyroid, Cricoid, Epiglottis + Arytenoid, Corniculate, Cuneiform"],
["Only laryngeal abductor", "PCA opens", "Posterior Cricoarytenoid = ONLY abductor"],
["Cricothyroid nerve exception", "CT = External SLN", "All other intrinsic muscles = RLN"],
["Weber direction", "CHL→Bad ear; SNHL→Good ear", "Goes where bone conduction is perceived better"],
["Nasolacrimal duct drainage", "I cry = Inferior", "Nasolacrimal → Inferior meatus"],
["Scala of cochlea VMT", "Very Musical Tones", "Vestibuli (top), Media (mid, endolymph), Tympani (bottom)"],
];
s.addTable(mnData, {
x: 0.18, y: 0.72, w: 9.64,
colW: [2.4, 2.4, 4.84],
fontSize: 8.8, fontFace: "Calibri",
border: { type: "solid", pt: 0.4, color: C.gold },
fill: { color: C.goldLt },
color: C.dark,
valign: "middle",
rowH: 0.28,
autoPage: false,
});
// header row overlay
s.addShape(pres.ShapeType.rect, { x: 0.18, y: 0.72, w: 9.64, h: 0.28, fill: { color: C.navy } });
s.addText("TOPIC MNEMONIC FULL FORM / TIP", {
x: 0.25, y: 0.72, w: 9.5, h: 0.28,
fontSize: 9, bold: true, color: C.gold, fontFace: "Calibri", valign: "middle",
});
}
// ═══════════════════════════════════════════════════════════════════════════════
// SECTION 5 — CLINICAL CORRELATIONS
// ═══════════════════════════════════════════════════════════════════════════════
sectionDivider("SECTION 5 — CLINICAL CORRELATIONS", "12 High-Yield ENT Conditions for MBBS & Clinical Exams", C.red);
tableSlide(
"5.1 — EAR: High-Yield Clinical Conditions",
C.blue,
["CONDITION", "ANATOMY BASIS", "EXAM PEARL"],
[
["Otosclerosis", "Stapes footplate fixation in oval window → sound transmission blocked", "Low-frequency CHL. Paracusis Willisi (hears better in noise). Flamingo-pink blush (Schwartze sign). Rx: Stapedectomy."],
["Cholesteatoma (Unsafe CSOM)", "Pars flaccida (Shrapnell's) lacks middle fibrous layer → epithelial invasion of attic → bone erosion", "Foul-smelling discharge + attic perforation + facial palsy = Unsafe CSOM. CT mastoid = bony erosion. Rx: Mastoidectomy."],
["Glue Ear (OME)", "Child's Eustachian tube: short, horizontal, poorly supported cartilage → poor drainage", "Flat type B tympanogram. Most common cause of childhood CHL. Rx: Grommets."],
["Meniere's Disease", "Endolymphatic hydrops (excess endolymph) in cochlea and vestibular labyrinth", "Triad: episodic vertigo + low-freq SNHL + tinnitus + aural fullness. Rx: Salt restriction, betahistine, diuretics."],
["Acoustic Neuroma (Vestibular Schwannoma)", "CN VIII vestibular division schwannoma at CPA / internal auditory meatus", "Unilateral SNHL + tinnitus + balance issues. MRI = gold standard. Rx: Surgery / radiosurgery."],
["BPPV", "Otoconia from UTRICLE dislodged into POSTERIOR SCC → abnormal cupular deflection with head movement", "Most common cause of vertigo. Dix-Hallpike test +ve. Rx: Epley manoeuvre (repositioning)."],
]
);
tableSlide(
"5.2 — NOSE & THROAT: High-Yield Clinical Conditions",
C.green,
["CONDITION", "ANATOMY BASIS", "EXAM PEARL"],
[
["Anterior Epistaxis", "Kiesselbach's plexus on anteroinferior septum (Little's area) — 5 arterial anastomoses, thin mucosa over cartilage", "Most common site (90%). Children + nose-pickers. Rx: Pinch → cautery → BIPP pack."],
["Posterior Epistaxis", "Woodruff's plexus on posterior lateral wall. Sphenopalatine artery = main vessel.", "Elderly hypertensives. Blood flows to throat. Rx: Posterior pack → sphenopalatine artery ligation."],
["Epiglottitis", "Supraglottis has loose connective tissue + rich lymphatics + NO rigid constraint → rapid unchecked oedema", "Thumb sign on lateral X-ray. Tripod posture + drooling. NEVER examine throat in A&E. Rx: Intubation in theatre + IV ceftriaxone."],
["Croup (LTB)", "Subglottis bounded by rigid cricoid ring → swelling constrained → stridor (narrowest in children)", "Steeple sign on AP X-ray. Barking cough. Rx: Dexamethasone + nebulised adrenaline."],
["Peritonsillar Abscess (Quinsy)", "Pus between tonsil capsule and superior constrictor → irritates medial pterygoid (trismus)", "Hot-potato voice + trismus + uvula deviates AWAY from abscess. Rx: I&D or needle aspiration."],
["RLN Palsy (Left)", "Left RLN loops under aortic arch (30 cm) → lung cancer/mediastinal mass compresses it", "Hoarseness + bovine cough + aspiration. Left cord immobile (paramedian). Investigate with CT chest."],
]
);
// Final summary slide
{
const s = pres.addSlide();
darkBg(s, C.gold);
s.addShape(pres.ShapeType.rect, { x:0, y:0, w:0.45, h:5.625, fill:{color:C.gold} });
s.addText("ENT ANATOMY — COMPLETE MBBS STUDY GUIDE", {
x:0.65, y:0.15, w:9.1, h:0.6,
fontSize:16, bold:true, color:C.gold, fontFace:"Calibri",
});
s.addText("Summary — What You Have Covered", {
x:0.65, y:0.8, w:9.1, h:0.45,
fontSize:13, color:C.white, fontFace:"Calibri", italic:true,
});
const cols = [
{ head:"SECTION 1 — EAR", color:C.blue, items:[
"External ear: auricle, EAC, cerumen",
"Tympanic membrane (pars tensa vs flaccida)",
"Middle ear: ossicles (MIS), epitympanum, mesotympanum",
"Eustachian tube anatomy (child vs adult)",
"Inner ear: cochlea (VMT), organ of Corti, vestibular apparatus",
"Blood & nerve supply (Arnold's nerve, CN VIII)",
]},
{ head:"SECTION 2 — NOSE", color:C.green, items:[
"External nose: ULC, LLC, keystone area",
"Nasal cavity walls + septum (PEV-C)",
"Turbinates & meatuses (M=maximum drainage)",
"Kiesselbach's plexus + Woodruff's plexus",
"Nerve supply: CN I, V1, V2, vidian nerve",
"4 paranasal sinuses: development, drainage, relations",
]},
{ head:"SECTION 3 — THROAT", color:C.red, items:[
"Pharynx: 3 parts, boundaries, muscles (IX=Stylopharyngeus)",
"Waldeyer's ring: 6 tonsils (PTTL)",
"Larynx: 9 cartilages (3+3 mnemonic)",
"Intrinsic muscles: PCA=only abductor",
"Nerve supply: RLN vs SLN + clinical consequences",
"Glottis anatomy: narrowest adult (rima) vs child (subglottis)",
]},
];
cols.forEach((col, i) => {
const cx = 0.65 + i * 3.05;
s.addShape(pres.ShapeType.rect, { x:cx, y:1.35, w:2.85, h:4.1,
fill:{color:C.panel}, line:{color:col.color, pt:1.5} });
s.addShape(pres.ShapeType.rect, { x:cx, y:1.35, w:2.85, h:0.45, fill:{color:col.color} });
s.addText(col.head, { x:cx, y:1.35, w:2.85, h:0.45,
fontSize:10, bold:true, color:C.navy, align:"center", valign:"middle", fontFace:"Calibri" });
s.addText(col.items.map((t,j)=>({ text:t,
options:{ bullet:true, fontSize:8.8, color:C.offwh, fontFace:"Calibri",
breakLine:j<col.items.length-1 }})),
{ x:cx+0.1, y:1.88, w:2.65, h:3.5, valign:"top", wrap:true });
});
s.addText("Sources: Cummings Otolaryngology · Scott-Brown's Otorhinolaryngology · K.J. Lee's Essential Otolaryngology · Gray's Anatomy for Students · Miller's Anesthesia 10e",
{ x:0.6, y:5.38, w:9.1, h:0.22,
fontSize:7, italic:true, color:C.mid, fontFace:"Calibri" });
}
// ── OUTPUT ────────────────────────────────────────────────────────────────────
const OUT = "/home/daytona/workspace/ent-anatomy/ENT_Anatomy_Complete_StudyGuide.pptx";
pres.writeFile({ fileName: OUT }).then(() => {
console.log("PPTX created:", OUT);
}).catch(err => { console.error(err); process.exit(1); });
cd /home/daytona/workspace/ent-anatomy && node build_ppt.js 2>&1
ls -lh /home/daytona/workspace/ent-anatomy/ENT_Anatomy_Complete_StudyGuide.pptx
ENT Anatomy Complete StudyGuide
Presentation · PPTX