Tumor markers in ent
tumor markers ENT head neck surgery calcitonin thyroglobulin SCC-Ag NPC EBV CEA
| Tumor | Key Marker(s) |
|---|---|
| Paraganglioma (glomus tumor) | Catecholamines, chromogranin A, 24-hr urine metanephrines |
| Juvenile nasopharyngeal angiofibroma | Androgen receptor (tissue marker) |
| Neuroblastoma (in pediatric ENT) | NSE, urinary VMA/HVA, AFP |
| Lymphoma (cervical) | LDH, beta-2 microglobulin, CD markers |
| Malignant melanoma (sinonasal/head neck) | S-100, LDH, HMB-45 |
| Carcinoid/neuroendocrine (laryngeal) | Chromogranin A, synaptophysin, NSE |
| Small cell carcinoma (head & neck) | Chromogranin A, synaptophysin, NCAM (neural cell adhesion molecule) - all neuroendocrine IHC markers |
| Marker | Cancer | Use |
|---|---|---|
| Thyroglobulin | Papillary/follicular thyroid Ca | Post-op surveillance |
| Calcitonin | Medullary thyroid Ca | Diagnosis, follow-up, family screening |
| CEA | Medullary thyroid Ca, HNSCC | Monitoring, MTC dedifferentiation |
| EBV-VCA IgA / EBV DNA | Nasopharyngeal carcinoma | Screening, monitoring, recurrence |
| SCC-Ag | Laryngeal, pharyngeal, oral SCC | Monitoring, prognosis |
| CYFRA 21-1 | HNSCC | Stage, prognosis, follow-up |
| p16 / HPV | Oropharyngeal SCC | Staging, prognosis |
| HER-2/neu | Salivary duct carcinoma, MEC | Prognosis, targeted therapy |
| Ki-67 | Salivary gland tumors, acinic cell Ca | Grading, prognosis |
| LDH | HNSCC, lymphoma | Grading, prognosis |
| Chromogranin A / NSE | Paraganglioma, neuroendocrine | Diagnosis, monitoring |
Local anaesthesia in ent
local anaesthesia ENT procedures nerve blocks nose ear throat larynx clinical
| Class | Bond | Examples | Notes |
|---|---|---|---|
| Aminoesters | -COO- | Cocaine, Procaine, Tetracaine, Benzocaine, Chloroprocaine | Metabolized by plasma cholinesterase; higher allergy risk; higher pKa = poor penetrance |
| Aminoamides | -NHCO- | Lidocaine, Bupivacaine, Ropivacaine, Prilocaine, Mepivacaine, Etidocaine | Metabolized by liver; true allergy extremely rare |
| Agent | Onset | Duration | Max Dose | Formulation | ENT Uses | Notes |
|---|---|---|---|---|---|---|
| Cocaine | 5-10 min | 30-60 min | 2-3 mg/kg | 4% solution | Nasal mucosa (topical only) | UNIQUE: only LA with vasoconstriction; blocks NE reuptake causing tachycardia, hypertension, mydriasis; sensitizes myocardium to catecholamines; rarely used now |
| Tetracaine | 5-10 min | 30 min | 20 mg (single dose) | 0.25-2% solution | Aerosol/topical for upper respiratory tract, ophthalmic | 1 mL of 2% = maximal dose |
| Benzocaine | 5-10 min | 30-60 min | 200 mg | 20% solution/ointment | Topical airway, mucosal dressings | Risk of methemoglobinemia; FDA: not for teething infants |
| Procaine | 2-5 min | 30-90 min | 1000 mg | 2% | Field/nerve blocks | Ineffective topically; prolongs succinylcholine effects |
| Chloroprocaine | 2-5 min | 30-60 min | 800-1000 mg | 2% | Field/nerve blocks, epidural | Low systemic toxicity; fastest hydrolysis |
| Agent | Onset | Duration | Max Dose | Formulation | ENT Uses | Notes |
|---|---|---|---|---|---|---|
| Lidocaine | 5-10 min | 1-3 hrs | 5 mg/kg plain; 7 mg/kg with epi | 0.5-2% injection; 4% topical/viscous; 5% ointment | Most versatile - topical nasal, nerve blocks, infiltration, transtracheal | IV 1.5 mg/kg blunts intubation/extubation response |
| Bupivacaine | 5-10 min | 3-10 hrs | 2-3 mg/kg | 0.125-0.75% | Long-duration infiltration, nerve blocks | Cardiac toxicity before CNS toxicity - closely monitor; liposomal form (Exparel) lasts up to 72 hrs |
| Ropivacaine | 5-10 min | 4-12 hrs | 1-3 mg/kg | 0.2-1.0% | Infiltration, peripheral nerve blocks, continuous infusions | Less cardiotoxic than bupivacaine; less motor block; preferred for catheters |
| Prilocaine | 2-4 min | 1-2 hrs | 8 mg/kg (max 600 mg) | 4% | Infiltration, dense nerve blocks | Methemoglobinemia at ≥600 mg |
| Mepivacaine | 30 sec-4 min | 1-4 hrs | 6 mg/kg (400 mg max) | 2-3% | Infiltration, dental, peripheral nerve blocks | Less vasodilation - used without epinephrine; dental anesthesia |
| Etidocaine | 3-8 min | (long) | 300 mg plain / 400 mg with epi | 0.5-1.0% | Local infiltration | Intense motor blockade |
| Drug | Class | Topical | Max Dose | Duration | Special Use in ENT |
|---|---|---|---|---|---|
| Cocaine | Ester | ✓✓✓ | 2-3 mg/kg | 30-60 min | Nasal decongestion + anesthesia |
| Tetracaine | Ester | ✓✓✓ | 20 mg | 30 min | Upper airway aerosol |
| Benzocaine | Ester | ✓✓✓ | 200 mg | 30-60 min | Mucosal/airway topical |
| Lidocaine | Amide | ✓✓✓ | 5/7 mg/kg | 1-3 hr | All ENT procedures; transtracheal |
| Bupivacaine | Amide | Poor | 2-3 mg/kg | 3-10 hr | Long postop blocks |
| Ropivacaine | Amide | Poor | 1-3 mg/kg | 4-12 hr | Infusions; safer than bupivacaine |
| Prilocaine | Amide | ✓✓ | 8 mg/kg | 1-2 hr | Dense blocks; EMLA (with lidocaine) |
Create a reference guide PDF for LA techniques in ENT procedures
ls /home/daytona/workspace/ && mkdir -p /home/daytona/workspace/la-ent-guide && echo "Directory ready"
~/la-ent-guide/generate_pdf.py
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_LEFT, TA_CENTER, TA_JUSTIFY
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, PageBreak, KeepTogether
)
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
import os
OUTPUT = "/home/daytona/workspace/la-ent-guide/LA_in_ENT_Reference_Guide.pdf"
# ── Colour palette ──────────────────────────────────────────────────
NAVY = colors.HexColor("#1A3A5C")
TEAL = colors.HexColor("#1A7A8A")
LIGHT_BG = colors.HexColor("#EBF5F8")
AMBER = colors.HexColor("#E07B00")
RED_WARN = colors.HexColor("#C0392B")
MID_GREY = colors.HexColor("#666666")
LIGHT_GREY= colors.HexColor("#F0F4F7")
WHITE = colors.white
BLACK = colors.black
TABLE_HDR = colors.HexColor("#1A3A5C")
ROW_ALT = colors.HexColor("#EBF5F8")
# ── Page layout ─────────────────────────────────────────────────────
PAGE_W, PAGE_H = A4
MARGIN = 1.8 * cm
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
leftMargin=MARGIN, rightMargin=MARGIN,
topMargin=MARGIN, bottomMargin=MARGIN,
title="Local Anaesthesia in ENT – Reference Guide",
author="Orris Clinical Reference",
subject="LA Techniques in ENT Procedures"
)
# ── Styles ───────────────────────────────────────────────────────────
styles = getSampleStyleSheet()
def S(name, **kw):
return ParagraphStyle(name, **kw)
TITLE_STYLE = S("Title",
fontName="Helvetica-Bold", fontSize=24,
textColor=WHITE, alignment=TA_CENTER,
spaceAfter=4)
SUBTITLE_STYLE = S("Subtitle",
fontName="Helvetica", fontSize=12,
textColor=colors.HexColor("#B8D4E0"), alignment=TA_CENTER,
spaceAfter=2)
BYLINE_STYLE = S("Byline",
fontName="Helvetica-Oblique", fontSize=9,
textColor=colors.HexColor("#90B8CC"), alignment=TA_CENTER)
H1 = S("H1",
fontName="Helvetica-Bold", fontSize=13,
textColor=WHITE, spaceBefore=6, spaceAfter=4,
leftIndent=6, rightIndent=6)
H2 = S("H2",
fontName="Helvetica-Bold", fontSize=10.5,
textColor=NAVY, spaceBefore=8, spaceAfter=3,
borderPad=2)
H3 = S("H3",
fontName="Helvetica-Bold", fontSize=9.5,
textColor=TEAL, spaceBefore=5, spaceAfter=2)
BODY = S("Body",
fontName="Helvetica", fontSize=8.8,
textColor=BLACK, leading=13, spaceAfter=3,
alignment=TA_JUSTIFY)
BULLET = S("Bullet",
fontName="Helvetica", fontSize=8.5,
textColor=BLACK, leading=12, spaceAfter=1.5,
leftIndent=12, bulletIndent=4)
WARN = S("Warn",
fontName="Helvetica-Bold", fontSize=8.5,
textColor=RED_WARN, leading=12, spaceAfter=3,
leftIndent=8)
NOTE = S("Note",
fontName="Helvetica-Oblique", fontSize=8,
textColor=MID_GREY, leading=11, spaceAfter=3,
leftIndent=8)
CAPTION = S("Caption",
fontName="Helvetica-Oblique", fontSize=7.5,
textColor=MID_GREY, alignment=TA_CENTER, spaceAfter=4)
TABLE_HDR_STYLE = S("TableHdr",
fontName="Helvetica-Bold", fontSize=8,
textColor=WHITE, alignment=TA_CENTER)
TABLE_CELL = S("TableCell",
fontName="Helvetica", fontSize=7.8,
textColor=BLACK, alignment=TA_CENTER, leading=10)
TABLE_CELL_L = S("TableCellL",
fontName="Helvetica", fontSize=7.8,
textColor=BLACK, alignment=TA_LEFT, leading=10)
TABLE_WARN_CELL = S("TableWarnCell",
fontName="Helvetica-Bold", fontSize=7.8,
textColor=RED_WARN, alignment=TA_CENTER, leading=10)
# ── Helper functions ─────────────────────────────────────────────────
def section_header(text):
"""Coloured full-width section header bar."""
tbl = Table([[Paragraph(text, H1)]], colWidths=[doc.width])
tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), NAVY),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 10),
("ROUNDEDCORNERS", [4]),
]))
return tbl
def sub_header(text):
return Paragraph(text, H2)
def sub_sub_header(text):
return Paragraph(text, H3)
def body(text):
return Paragraph(text, BODY)
def bullet(text, symbol="•"):
return Paragraph(f"{symbol} {text}", BULLET)
def warning(text):
return Paragraph(f"⚠ {text}", WARN)
def note(text):
return Paragraph(f"ℹ {text}", NOTE)
def sp(h=4):
return Spacer(1, h)
def hr():
return HRFlowable(width="100%", thickness=0.5, color=colors.HexColor("#CCDDEA"), spaceAfter=4)
def make_table(headers, rows, col_widths, alt_rows=True, warn_col=None):
"""Build a styled data table."""
hdr_row = [Paragraph(h, TABLE_HDR_STYLE) for h in headers]
data = [hdr_row]
for row in rows:
cells = []
for i, cell in enumerate(row):
style = TABLE_WARN_CELL if (warn_col and i == warn_col and "⚠" in str(cell)) else TABLE_CELL_L if i == 0 else TABLE_CELL
cells.append(Paragraph(str(cell), style))
data.append(cells)
tbl = Table(data, colWidths=col_widths, repeatRows=1)
ts = [
("BACKGROUND", (0, 0), (-1, 0), TABLE_HDR),
("TEXTCOLOR", (0, 0), (-1, 0), WHITE),
("FONTNAME", (0, 0), (-1, 0), "Helvetica-Bold"),
("FONTSIZE", (0, 0), (-1, 0), 8),
("TOPPADDING", (0, 0), (-1,-1), 4),
("BOTTOMPADDING", (0, 0), (-1,-1), 4),
("LEFTPADDING", (0, 0), (-1,-1), 5),
("RIGHTPADDING", (0, 0), (-1,-1), 5),
("GRID", (0, 0), (-1,-1), 0.4, colors.HexColor("#AACCD8")),
("VALIGN", (0, 0), (-1,-1), "MIDDLE"),
("ROWBACKGROUNDS",(0, 1), (-1,-1), [WHITE, ROW_ALT] if alt_rows else [WHITE]),
]
tbl.setStyle(TableStyle(ts))
return tbl
def info_box(content_list, bg=LIGHT_BG, border=TEAL):
"""Bordered info/tip box."""
inner = []
for item in content_list:
inner.append(item)
tbl = Table([[inner]], colWidths=[doc.width - 2])
tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 10),
("TOPPADDING", (0,0), (-1,-1), 7),
("BOTTOMPADDING", (0,0), (-1,-1), 7),
("BOX", (0,0), (-1,-1), 1.5, border),
("ROUNDEDCORNERS", [4]),
]))
return tbl
# ═══════════════════════════════════════════════════════════════════
# BUILD DOCUMENT
# ═══════════════════════════════════════════════════════════════════
story = []
# ── COVER BANNER ────────────────────────────────────────────────────
cover_data = [[
Paragraph("Local Anaesthesia in ENT", TITLE_STYLE),
Paragraph("A Comprehensive Clinical Reference Guide", SUBTITLE_STYLE),
Paragraph("Agents · Doses · Nerve Blocks · Toxicity Management", BYLINE_STYLE),
]]
cover_tbl = Table(cover_data, colWidths=[doc.width])
cover_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), NAVY),
("TOPPADDING", (0,0), (-1,-1), 20),
("BOTTOMPADDING", (0,0), (-1,-1), 20),
("LEFTPADDING", (0,0), (-1,-1), 16),
("RIGHTPADDING", (0,0), (-1,-1), 16),
("ROUNDEDCORNERS", [6]),
]))
story.append(cover_tbl)
story.append(sp(10))
# ══════════════════════════════════════════════════════════════════
# SECTION 1: MECHANISM & CLASSIFICATION
# ══════════════════════════════════════════════════════════════════
story.append(section_header("1. Mechanism of Action & Classification"))
story.append(sp(6))
story.append(body(
"Local anaesthetics (LAs) reversibly block <b>voltage-gated sodium channels</b>, "
"preventing sodium influx, depolarisation, and propagation of the nerve impulse. "
"The <b>non-ionized (uncharged) form</b> crosses the lipid membrane barrier; once inside, "
"the ionized form binds the channel from within."
))
story.append(sp(4))
story.append(sub_header("Three Molecular Properties Governing Activity"))
story.append(make_table(
["Property", "Effect", "Clinical Impact"],
[
["Lipid solubility", "↑ solubility = ↑ potency", "Bupivacaine > Lidocaine > Procaine"],
["pKa (ionisation)", "Higher pKa = more ionised at tissue pH = slower onset", "Esters have higher pKa → poor topical penetrance"],
["Protein binding", "Higher binding = longer duration", "Bupivacaine 95% → longest duration"],
],
col_widths=[4.5*cm, 6*cm, 7.5*cm]
))
story.append(sp(6))
story.append(sub_header("Why LA Fails in Infected Tissue"))
story.append(info_box([
body("Infected tissues have <b>reduced pH</b>, shifting equilibrium toward the ionized form. "
"Less non-ionized drug is available to cross membranes → poor or absent block."),
sp(2),
body("<b>Solution:</b> Block the nerve <i>proximally</i> in healthy, uninfected tissue. "
"Alkalization with NaHCO₃ can partially reverse this effect."),
]))
story.append(sp(8))
story.append(sub_header("Classification: Esters vs. Amides"))
ester_amide_data = [
["Feature", "AMINOESTERS (−COO−)", "AMINOAMIDES (−NHCO−)"],
["Metabolism", "Plasma cholinesterase (+ liver)", "Hepatic (CYP450 + carboxylesterases)"],
["Allergy", "More common (PABA metabolite)", "Extremely rare"],
["Cross-reactivity", "Within ester class", "None between classes"],
["pKa", "Higher → slower onset", "Lower → faster onset"],
["Examples", "Cocaine, Procaine, Tetracaine,\nBenzocaine, Chloroprocaine", "Lidocaine, Bupivacaine, Ropivacaine,\nPrilocaine, Mepivacaine"],
]
e_tbl = Table(
[[Paragraph(r[0], TABLE_WARN_CELL if r[0]=="Feature" else TABLE_CELL_L),
Paragraph(r[1], TABLE_HDR_STYLE if r[0]=="Feature" else TABLE_CELL),
Paragraph(r[2], TABLE_HDR_STYLE if r[0]=="Feature" else TABLE_CELL)]
for r in ester_amide_data],
colWidths=[4.5*cm, 8*cm, 8*cm], repeatRows=1
)
e_tbl.setStyle(TableStyle([
("BACKGROUND", (0, 0), (-1, 0), TABLE_HDR),
("BACKGROUND", (0, 1), (0,-1), colors.HexColor("#F5F5F5")),
("FONTNAME", (0, 0), (-1, 0), "Helvetica-Bold"),
("FONTSIZE", (0, 0), (-1,-1), 8),
("TOPPADDING", (0, 0), (-1,-1), 4),
("BOTTOMPADDING", (0, 0), (-1,-1), 4),
("LEFTPADDING", (0, 0), (-1,-1), 5),
("GRID", (0, 0), (-1,-1), 0.4, colors.HexColor("#AACCD8")),
("VALIGN", (0, 0), (-1,-1), "MIDDLE"),
("ROWBACKGROUNDS",(0, 1), (-1,-1), [WHITE, ROW_ALT]),
("TEXTCOLOR", (0, 0), (-1, 0), WHITE),
("FONTNAME", (0, 1), (0,-1), "Helvetica-Bold"),
("TEXTCOLOR", (0, 1), (0,-1), NAVY),
]))
story.append(e_tbl)
story.append(sp(8))
# ══════════════════════════════════════════════════════════════════
# SECTION 2: INDIVIDUAL AGENTS
# ══════════════════════════════════════════════════════════════════
story.append(PageBreak())
story.append(section_header("2. Local Anaesthetic Agents — Quick Reference"))
story.append(sp(6))
story.append(sub_header("2A. Aminoester Agents"))
ester_rows = [
["Cocaine", "Ester", "5–10 min", "30–60 min", "2–3 mg/kg", "4% solution",
"Topical nasal only", "Only LA with vasoconstriction; blocks NE reuptake → ↑HR, ↑BP; sensitises myocardium to catecholamines; rarely used now"],
["Tetracaine", "Ester", "5–10 min", "30 min", "20 mg (single)", "0.25–2% soln",
"Upper airway aerosol; ophthalmic; spinal", "1 mL of 2% = max dose"],
["Benzocaine", "Ester", "5–10 min", "30–60 min", "200 mg", "20% soln/ointment",
"Topical airway; mucosal dressings", "⚠ Methemoglobinemia risk; FDA: not for teething infants"],
["Procaine", "Ester", "2–5 min", "30–90 min", "1000 mg", "2%",
"Field/nerve blocks", "Ineffective topically; prolongs succinylcholine"],
["Chloro-procaine", "Ester", "2–5 min", "30–60 min", "800–1000 mg", "2%",
"Field/nerve blocks; epidural", "Fastest hydrolysis; low systemic toxicity"],
]
ester_hdrs = ["Agent","Class","Onset","Duration","Max Dose","Formulation","ENT Use","Notes"]
ester_widths = [2.3*cm,1.5*cm,1.6*cm,1.8*cm,2.2*cm,2.2*cm,3.2*cm,6.2*cm]
def make_agent_table(headers, rows, col_widths):
hdr = [Paragraph(h, TABLE_HDR_STYLE) for h in headers]
data = [hdr]
for row in rows:
cells = []
for i, cell in enumerate(row):
s = TABLE_CELL_L if i in (0,6,7) else TABLE_CELL
if "⚠" in str(cell):
s = S("WC", fontName="Helvetica-Bold", fontSize=7.5,
textColor=RED_WARN, alignment=TA_LEFT, leading=10)
cells.append(Paragraph(str(cell), s))
data.append(cells)
tbl = Table(data, colWidths=col_widths, repeatRows=1)
tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), TABLE_HDR),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 7.5),
("TOPPADDING", (0,0), (-1,-1), 3),
("BOTTOMPADDING", (0,0), (-1,-1), 3),
("LEFTPADDING", (0,0), (-1,-1), 4),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#AACCD8")),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("ROWBACKGROUNDS",(0,1), (-1,-1), [WHITE, ROW_ALT]),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
]))
return tbl
story.append(make_agent_table(ester_hdrs, ester_rows, ester_widths))
story.append(sp(8))
story.append(sub_header("2B. Aminoamide Agents"))
amide_rows = [
["Lidocaine", "Amide", "5–10 min", "1–3 hr",
"5 mg/kg plain\n7 mg/kg + epi", "0.5–2% inj;\n4% topical;\n5% ointment",
"All ENT procedures;\ntranstracheal block;\nnasal infiltration",
"Most versatile ENT agent; IV 1.5 mg/kg blunts intubation response"],
["Bupivacaine", "Amide", "5–10 min", "3–10 hr",
"2–3 mg/kg", "0.125–0.75%",
"Long-duration blocks;\npost-op analgesia",
"⚠ Cardiac toxicity before CNS toxicity; liposomal (Exparel) lasts up to 72 hr"],
["Ropivacaine", "Amide", "5–10 min", "4–12 hr",
"1–3 mg/kg", "0.2–1.0%",
"Infiltration;\ncontinuous catheters",
"Less cardiotoxic than bupivacaine; less motor block; preferred for infusions"],
["Prilocaine", "Amide", "2–4 min", "1–2 hr",
"8 mg/kg\n(max 600 mg)", "4%",
"Dense nerve blocks;\nEMLA component",
"⚠ Methemoglobinemia at ≥600 mg; less vasodilation → used without epi"],
["Mepivacaine", "Amide", "30 sec–4 min", "1–4 hr",
"6 mg/kg\n(max 400 mg)", "2–3%",
"Infiltration;\ndental blocks",
"Less vasodilation → no epi needed; 2% contains levonordefrin (sulfite → anaphylaxis risk)"],
["Etidocaine", "Amide", "3–8 min", "Long",
"300 mg plain\n400 mg + epi", "0.5–1.0%",
"Local infiltration",
"Intense motor blockade; sensory + motor block"],
]
story.append(make_agent_table(ester_hdrs, amide_rows, ester_widths))
story.append(sp(8))
story.append(sub_header("2C. Miscellaneous Agents"))
misc_rows = [
["Cyclonine", "Neither ester nor amide", "2–10 min", "30 min", "300 mg", "0.5%",
"Topical only (irritating if injected)", "Use if allergy to BOTH ester AND amide classes"],
["Cetacaine", "Combination (Benzocaine +\nButyl aminobenzoate +\nTetracaine)", "30 sec", "–", "Max 2 × 1-sec sprays\n(400 mg equiv)", "Spray",
"Mucosal anaesthesia;\nairway", "Rapid onset; useful for endoscopy, nasopharyngoscopy"],
]
story.append(make_agent_table(
["Agent","Composition","Onset","Duration","Max Dose","Formulation","ENT Use","Notes"],
misc_rows,
[2.3*cm, 3.2*cm, 1.6*cm, 1.6*cm, 2.5*cm, 1.8*cm, 3*cm, 4.9*cm]
))
story.append(sp(8))
# ══════════════════════════════════════════════════════════════════
# SECTION 3: VASOCONSTRICTORS & ADDITIVES
# ══════════════════════════════════════════════════════════════════
story.append(PageBreak())
story.append(section_header("3. Vasoconstrictors & Additives"))
story.append(sp(6))
story.append(sub_header("Adrenaline (Epinephrine)"))
story.append(body(
"Routinely added to LA solutions in ENT to extend block duration, reduce systemic absorption "
"(increase safety margin), and minimise operative blood loss."
))
story.append(sp(4))
story.append(make_table(
["Concentration", "Preparation", "ENT Application"],
[
["1:100,000", "1 mg per 100 mL", "Standard nasal infiltration, nerve blocks"],
["1:200,000", "1 mg per 200 mL", "Subcutaneous infiltration, paediatric"],
],
col_widths=[4*cm, 6*cm, 10.5*cm]
))
story.append(sp(5))
story.append(warning(
"AVOID epinephrine in patients on <b>tricyclic antidepressants (TCAs)</b> or "
"<b>MAO inhibitors</b> — risk of <b>hypertensive crisis</b>."
))
story.append(warning(
"Epinephrine toxicity: restlessness, palpitations, headache, ventricular irritability, seizures. "
"Treat tachycardia/hypertension with <b>esmolol</b>."
))
story.append(sp(6))
story.append(sub_header("Sodium Bicarbonate Buffering"))
story.append(info_box([
body("<b>Technique:</b> Mix NaHCO₃ (7.5%) with lidocaine in a <b>1:10 ratio</b> "
"(1 mL bicarb + 10 mL lidocaine)."),
sp(2),
body("<b>Effect:</b> Raises pH → increases non-ionized fraction → <b>faster onset</b> + "
"<b>significantly less burning pain</b> on injection."),
sp(2),
body("<b>Injection tips:</b> Use ≥27-gauge needle; inject slowly within the mucosal-submucosal plane. "
"EMLA cream applied 1 hour before nasal surgery provides similar anaesthesia with less patient discomfort than needle infiltration alone."),
]))
story.append(sp(8))
# ══════════════════════════════════════════════════════════════════
# SECTION 4: ENT-SPECIFIC NERVE BLOCKS
# ══════════════════════════════════════════════════════════════════
story.append(section_header("4. ENT-Specific Nerve Blocks & Techniques"))
story.append(sp(6))
# ── 4A Nasal ─────────────────────────────────────────────────────
story.append(sub_header("4A. Nasal Surgery (Septoplasty, Rhinoplasty, FESS, Fracture Reduction)"))
story.append(body(
"A combined <b>topical + infiltration</b> technique provides excellent anaesthesia "
"for most nasal procedures. Targets: anterior/posterior ethmoidal nerves, "
"sphenopalatine nerve, nasopalatine nerve, and infraorbital nerve."
))
story.append(sp(4))
nasal_steps = [
["Step 1", "Topical pledgets",
"Cotton pledgets soaked in <b>4% cocaine</b> OR <b>0.05% oxymetazoline + 4% topical lidocaine</b> "
"placed strategically to cover all nasal nerve branches. Leave in situ 5–10 min."],
["Step 2", "Infiltration",
"<b>1% lidocaine + 1:100,000 adrenaline</b> injected along the septum, lateral walls, and floor of the nasal cavity."],
["Step 3", "External nasal nerve",
"Intercartilaginous injection along the dorsum from rhinion to supratip."],
["Step 4", "Infraorbital nerve block",
"Needle through vestibule to just below midportion of orbital rim. Anaesthetises V2 terminal branch."],
["Step 5", "Nasopalatine nerve block",
"Injection at base of columella and nasal tip just inside the nasal sill."],
["Step 6", "Posterior pledgets",
"Pledgets replaced posteriorly for 5 more minutes to maximise deep anaesthesia."],
]
step_tbl = Table(
[[Paragraph(r[0], S("StepNum", fontName="Helvetica-Bold", fontSize=8.5,
textColor=WHITE, alignment=TA_CENTER)),
Paragraph(r[1], S("StepName", fontName="Helvetica-Bold", fontSize=8.5,
textColor=NAVY)),
Paragraph(r[2], TABLE_CELL_L)]
for r in nasal_steps],
colWidths=[1.5*cm, 4.2*cm, doc.width - 5.7*cm],
)
step_bg = [TEAL if i % 2 == 0 else colors.HexColor("#1E6A7A") for i in range(len(nasal_steps))]
step_ts = [
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("GRID", (0,0), (-1,-1), 0.3, colors.HexColor("#AACCD8")),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]
for i, bg in enumerate(step_bg):
step_ts.append(("BACKGROUND", (0, i), (0, i), bg))
step_ts.append(("TEXTCOLOR", (0, i), (0, i), WHITE))
step_ts.append(("ROWBACKGROUNDS", (1,0), (1,-1), [WHITE, ROW_ALT]))
step_tbl.setStyle(TableStyle(step_ts))
story.append(step_tbl)
story.append(sp(6))
story.append(sub_header("Anterior Ethmoid Nerve Block"))
story.append(body(
"Cotton applicator soaked in LA passed along the <b>dorsal surface of the nose</b> until "
"the anterior cribriform plate is reached. Selective blockade achieved after 5–10 minutes."
))
story.append(sp(6))
# ── 4B Ear ───────────────────────────────────────────────────────
story.append(sub_header("4B. Ear (Otology)"))
story.append(body(
"The external auditory canal (EAC) is innervated by multiple nerves, requiring a circumferential block:"
))
story.append(make_table(
["Nerve", "Origin", "Region Supplied", "Block Technique"],
[
["Auriculotemporal nerve", "V3 (trigeminal)", "Anterior EAC & TM", "Injection anterior to tragus"],
["Arnold's nerve (auricular branch)", "Vagus (CN X)", "Posterior EAC", "Injection posterosuperior to EAC"],
["Greater auricular nerve", "C2/C3", "Posterior auricle & EAC", "Injection at posterior sulcus"],
["Auricular branch of facial nerve", "CN VII", "Posteromedial EAC", "Included in circumferential block"],
],
col_widths=[4.5*cm, 3.5*cm, 4.5*cm, 6*cm]
))
story.append(sp(4))
story.append(info_box([
body("<b>Circumferential 'ring' block:</b> 1–2 mL of 1% lidocaine + 1:100,000 adrenaline "
"injected at 4 quadrants of the bony-cartilaginous junction for myringotomy, "
"cerumen removal, and minor EAC procedures in adults."),
sp(2),
body("<b>Tympanic membrane (TM):</b> EMLA cream applied topically to TM for 30–60 min "
"provides adequate anaesthesia for myringotomy / grommet insertion under LA."),
]))
story.append(sp(6))
# ── 4C Pharynx / Tonsil ─────────────────────────────────────────
story.append(sub_header("4C. Pharynx, Tonsil & Oropharynx"))
story.append(sub_sub_header("Glossopharyngeal Nerve Block (Peritonsillar Block)"))
story.append(body(
"The glossopharyngeal nerve (CN IX) exits the jugular foramen and supplies the pharyngeal, "
"tonsillar, and lingual branches."
))
story.append(make_table(
["Indication", "Technique", "Volume / Agent"],
[
["Peritonsillar abscess drainage", "Inject at the base of the anterior tonsillar pillar (superior pole); needle depth ~1 cm into mucosa", "2–3 mL of 1% lidocaine + 1:100,000 adrenaline"],
["Oropharyngeal instrumentation", "Topical spray to posterior pharynx + tonsillar pillars", "4% lidocaine spray or 20% benzocaine (Cetacaine)"],
],
col_widths=[5*cm, 9*cm, 5.5*cm]
))
story.append(sp(4))
story.append(sub_sub_header("Sphenopalatine Ganglion (SPG) Block"))
story.append(body(
"The SPG is the largest extracranial parasympathetic ganglion, lying in the pterygopalatine fossa. "
"It is accessible via the nasal mucosa overlying the posterior middle meatus."
))
story.append(make_table(
["Approach", "Technique", "Agent", "Uses in ENT"],
[
["Intranasal topical (preferred)", "Cotton-tipped applicators soaked in LA directed to posterior middle meatus just anterior to posterior nasal wall; leave 20–30 min",
"4% lidocaine or 10% cocaine", "Cluster headache, FESS analgesia, nasal/sinus procedures, migraines"],
["Transnasal needle injection", "Direct injection into pterygopalatine fossa via nasal endoscope",
"1% lidocaine + 1:100,000 adrenaline", "Post-rhinoplasty analgesia, chronic facial pain"],
["Greater palatine canal", "Transoral needle through greater palatine foramen",
"1.5–2 mL 2% lidocaine", "Palatal surgery; caution: risk of permanent nerve damage if foramen entered"],
],
col_widths=[4*cm, 7*cm, 3.5*cm, 5*cm]
))
story.append(sp(4))
story.append(note(
"Warn patient: bitter taste, temporary throat numbness, transient nasal congestion, or "
"mild droopy eyelid (Horner-like) after SPG block with topical anesthetic."
))
story.append(sp(6))
# ── 4D Larynx / Trachea ──────────────────────────────────────────
story.append(PageBreak())
story.append(section_header("4D. Laryngeal & Tracheal Blocks (Awake Intubation / Laryngoscopy)"))
story.append(sp(6))
story.append(body(
"Complete laryngotracheal anaesthesia requires blocking the <b>superior laryngeal nerve (SLN)</b> "
"bilaterally and performing a <b>transtracheal injection</b>. This enables awake fiberoptic intubation "
"and direct laryngoscopy under LA."
))
story.append(sp(5))
larynx_data = [
["Block", "Nerve / Structure", "Anatomy Key Point", "Technique", "Agent & Volume"],
["Superior Laryngeal Nerve (SLN) Block",
"Internal branch of SLN (sensory to supraglottis/glottis); External branch (motor to cricothyroid)",
"SLN divides at level of hyoid; internal branch pierces thyrohyoid membrane",
"Inject LA lateral to thyroid cartilage, directing needle to pierce thyrohyoid membrane. Perform bilaterally.",
"2 mL of 2% lidocaine each side"],
["Transtracheal Block\n(Recurrent Laryngeal Nerve)",
"Recurrent laryngeal nerve — motor to all intrinsic laryngeal muscles except cricothyroid; sensory to subglottis/trachea",
"Cricothyroid membrane — midline, between thyroid cartilage (above) and cricoid (below)",
"Palpate cricothyroid membrane. Insert 20–22G needle in midline; advance until air is freely aspirated. Inject rapidly on <b>expiration</b> — coughing disperses LA.",
"4 mL of 4% lidocaine"],
["Topical Airway\n(Spray-as-you-go)",
"All mucosal surfaces of airway",
"Used with fiberoptic scope via injection port",
"Spray LA through working channel of scope as it advances through glottis into trachea",
"4% lidocaine; total dose ≤9 mg/kg"],
]
lx_tbl = Table(
[[Paragraph(r[i], TABLE_HDR_STYLE if row_idx==0 else (TABLE_CELL_L if i in (0,3,4) else TABLE_CELL))
for i, _ in enumerate(r)]
for row_idx, r in enumerate(larynx_data)],
colWidths=[3.2*cm, 3.8*cm, 3.5*cm, 6*cm, 3*cm], repeatRows=1
)
lx_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), TABLE_HDR),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 7.8),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 4),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#AACCD8")),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("ROWBACKGROUNDS",(0,1), (-1,-1), [WHITE, ROW_ALT]),
]))
story.append(lx_tbl)
story.append(sp(5))
story.append(warning(
"NEVER directly infiltrate the <b>recurrent laryngeal nerve</b> — it supplies ALL intrinsic "
"laryngeal muscles (except cricothyroid). Bilateral damage causes vocal cord paralysis and "
"<b>acute airway obstruction</b>."
))
story.append(warning(
"Laryngeal and tracheal mucosa have extremely rapid LA absorption approaching IV levels. "
"Monitor closely for systemic toxicity. Keep cumulative dose within safe limits."
))
story.append(sp(6))
story.append(sub_header("Facial Nerve Blocks Relevant to ENT"))
story.append(make_table(
["Nerve Block", "Target", "Landmark", "Volume"],
[
["Infraorbital", "V2 terminal — nose, upper lip, cheek", "Through vestibule to below midpoint of orbital rim", "2–3 mL 1% lidocaine + epi"],
["Supraorbital / Supratrochlear", "Forehead / scalp", "Supraorbital notch / medial orbital rim", "1–2 mL each"],
["Auriculotemporal", "Temporal region, anterior ear", "Just anterior to tragus", "2–3 mL 1% lidocaine"],
["Greater auricular", "Posterior ear, parotid region", "Posterior border of SCM at Erb's point", "3–5 mL 1% lidocaine"],
["Zygomaticofacial / Zygomaticotemporal", "Zygomatic region", "Zygomaticofacial foramen on cheekbone", "1–2 mL 1% lidocaine"],
],
col_widths=[4.5*cm, 4.5*cm, 6*cm, 4.5*cm]
))
story.append(sp(8))
# ══════════════════════════════════════════════════════════════════
# SECTION 5: TOXICITY & MANAGEMENT
# ══════════════════════════════════════════════════════════════════
story.append(PageBreak())
story.append(section_header("5. Toxicity — Recognition & Management"))
story.append(sp(6))
story.append(sub_header("Local Anaesthetic Systemic Toxicity (LAST)"))
story.append(body(
"Toxic blood levels can result from: <b>rapid absorption</b> (especially laryngeal/tracheal mucosa), "
"<b>excessive dose</b>, or <b>inadvertent intravascular injection</b>."
))
story.append(sp(5))
story.append(sub_sub_header("CNS Toxicity — Dose-Dependent Progression"))
tox_progression = [
["Stage", "Signs & Symptoms", "Action"],
["Early", "Perioral/circumoral paraesthesia, tinnitus, metallic taste, dizziness", "Stop injection; monitor; reassure"],
["Intermediate", "Mental status changes, slurred speech, visual disturbance", "IV access; supplemental O₂; alert team"],
["Severe", "Tonic-clonic seizures", "Benzodiazepines (diazepam preferred) + airway support"],
["Critical", "Coma, respiratory arrest", "ACLS + Intralipid rescue (see below)"],
]
tox_tbl = Table(
[[Paragraph(r[i], TABLE_HDR_STYLE if row_idx==0
else (S("StageCell", fontName="Helvetica-Bold", fontSize=8,
textColor=RED_WARN if row_idx>=3 else AMBER if row_idx==2 else colors.HexColor("#E08A00"),
alignment=TA_CENTER) if i==0
else TABLE_CELL_L))
for i, _ in enumerate(r)]
for row_idx, r in enumerate(tox_progression)],
colWidths=[2.5*cm, 9*cm, 8*cm], repeatRows=1
)
tox_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), TABLE_HDR),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#AACCD8")),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("ROWBACKGROUNDS",(0,1), (-1,-1), [WHITE, ROW_ALT]),
]))
story.append(tox_tbl)
story.append(sp(5))
story.append(sub_sub_header("Cardiovascular Toxicity"))
story.append(make_table(
["Drug", "Cardiovascular Risk", "Key Feature"],
[
["Bupivacaine", "HIGHEST", "Cardiac toxicity precedes CNS toxicity; direct myocardial depression; rapid collapse possible"],
["Ropivacaine", "MODERATE", "Less cardiotoxic than bupivacaine at equipotent doses"],
["Lidocaine", "LOW–MODERATE", "Classic CNS symptoms appear before cardiac effects"],
["All agents", "Dose-related", "Diminished contractility + reduced peripheral vascular tone at toxic doses"],
],
col_widths=[3*cm, 3*cm, 13.5*cm]
))
story.append(sp(6))
story.append(sub_header("LAST Treatment Protocol — 20% Lipid Emulsion (Intralipid)"))
story.append(info_box([
Paragraph("<b>ACLS first</b> — call for help, maintain airway, commence ACLS protocol", BODY),
sp(3),
Paragraph("<b>Step 1 — Bolus:</b> 1.5 mL/kg of <b>20% Intralipid</b> IV over 1 minute", BODY),
sp(2),
Paragraph("<b>Step 2 — Infusion:</b> 0.5 mL/kg/min until haemodynamic stability", BODY),
sp(2),
Paragraph("<b>Maximum dose:</b> 10 mL/kg over 30 minutes total", BODY),
sp(2),
Paragraph("<b>Note:</b> Lipid emulsion is effective for both CNS and cardiac toxicity. "
"Works by creating a 'lipid sink' that sequesters LA away from tissues.", NOTE),
sp(2),
Paragraph("Reference: www.lipidrescue.org", NOTE),
], bg=colors.HexColor("#FFF3E0"), border=AMBER))
story.append(sp(6))
story.append(sub_header("Methemoglobinemia"))
story.append(make_table(
["Causative Agent", "Threshold / Risk Factor", "Diagnosis", "Treatment"],
[
["Prilocaine", "≥600 mg (or lower in G6PD deficiency)", "Pulse oximetry unreliable — reads ~85% regardless of true SaO₂", "IV methylene blue 1–2 mg/kg as 1% solution"],
["Benzocaine", "Topical overdose; Hurricane spray misuse", "Co-oximetry required for accurate measurement", "IV methylene blue 1–2 mg/kg as 1% solution"],
],
col_widths=[3.5*cm, 5*cm, 6*cm, 5*cm]
))
story.append(sp(4))
story.append(warning("Pulse oximetry is UNRELIABLE in methemoglobinemia — it reads ~85% regardless of actual saturation. Always confirm with co-oximetry."))
story.append(sp(6))
story.append(sub_header("Allergy & Adverse Reactions"))
story.append(make_table(
["Reaction Type", "Frequency", "Cause", "Management"],
[
["True allergy", "<1% of all adverse reactions", "Usually methylparaben or metabisulfite preservative (not the LA itself)", "Use preservative-free LA; use opposite class agent"],
["Cross-reactivity", "Within ester class only", "PABA metabolite of esters", "Amide LAs are safe if ester allergy is confirmed"],
["Ester allergy", "More common", "PABA metabolite cross-reacts within ester class", "Switch to amide class (lidocaine, bupivacaine, etc.)"],
["Toxic/vasovagal", "Common (misdiagnosed as allergy)", "Adrenaline palpitations / vasovagal syncope / anxiety", "History, testing; often not true allergy"],
],
col_widths=[3.5*cm, 3*cm, 6*cm, 7*cm]
))
story.append(sp(8))
# ══════════════════════════════════════════════════════════════════
# SECTION 6: PHARMACOKINETICS SUMMARY
# ══════════════════════════════════════════════════════════════════
story.append(PageBreak())
story.append(section_header("6. Pharmacokinetics & Special Considerations"))
story.append(sp(6))
story.append(sub_header("Absorption by Site (ENT Context)"))
story.append(make_table(
["Site", "Absorption Rate", "Clinical Implication"],
[
["Laryngeal & tracheal mucosa", "VERY HIGH — approaches IV injection levels", "Highest LAST risk in ENT; strict dose limits essential"],
["Nasal mucosa", "HIGH", "Cocaine/lidocaine absorbed rapidly; decongestant + pledget technique recommended"],
["Pharyngeal mucosa", "MODERATE–HIGH", "Spray-as-you-go technique requires careful dose tracking"],
["Subcutaneous injection", "LOW–MODERATE", "Standard safety margins apply; lower with epinephrine"],
["EAC injection", "LOW", "Relatively safe; minimal systemic absorption"],
],
col_widths=[5*cm, 5.5*cm, 9*cm]
))
story.append(sp(6))
story.append(sub_header("Metabolism & Excretion"))
story.append(make_table(
["Pathway", "Agent Class", "Important Drug Interactions"],
[
["Plasma cholinesterase hydrolysis", "Esters (procaine, chloroprocaine, cocaine)", "Inhibit plasma cholinesterase → prolong succinylcholine effect"],
["Hepatic CYP450 + carboxylesterases", "Amides (lidocaine, bupivacaine, etc.)", "Impaired in liver disease → toxicity at lower doses"],
["Renal excretion", "Both classes (metabolites)", "Caution in renal impairment — metabolite accumulation"],
],
col_widths=[6*cm, 5*cm, 8.5*cm]
))
story.append(sp(4))
story.append(warning(
"Both ester and amide metabolism are compromised in <b>parenchymal liver disease</b>. "
"Reduce doses accordingly and monitor closely."
))
story.append(sp(6))
story.append(sub_header("Maximum Dose Quick Reference"))
story.append(make_table(
["Agent", "Plain (mg/kg)", "With Adrenaline (mg/kg)", "Absolute Max (adult)"],
[
["Lidocaine", "5", "7", "500 mg plain / 700 mg with epi"],
["Bupivacaine", "2", "3", "175 mg plain / 225 mg with epi"],
["Ropivacaine", "3", "3", "225 mg (no added benefit from epi)"],
["Prilocaine", "6", "8", "400 mg plain / 600 mg with epi"],
["Mepivacaine", "5", "6", "400 mg"],
["Cocaine", "2–3", "N/A — inherent vasoconstriction", "200 mg (topical only)"],
["Tetracaine", "—", "—", "20 mg (single topical dose)"],
["Benzocaine", "—", "—", "200 mg"],
],
col_widths=[4*cm, 3.5*cm, 5.5*cm, 6.5*cm]
))
story.append(sp(8))
# ══════════════════════════════════════════════════════════════════
# SECTION 7: CLINICAL PEARLS
# ══════════════════════════════════════════════════════════════════
story.append(section_header("7. Clinical Pearls & Practical Tips"))
story.append(sp(6))
pearls = [
("Buffering reduces pain", "Add 1 mL of 7.5% NaHCO₃ per 10 mL lidocaine. Significantly reduces the burning sensation of LA injection. Use routinely for nasal blocks."),
("Cocaine's unique dual role", "Cocaine is the only LA that provides both anaesthesia AND vasoconstriction. Invaluable for nasal endoscopy and surgery, but avoid in patients with cardiovascular disease or drug misuse."),
("Pledget technique", "Cotton pledgets soaked in LA act as a reservoir for mucosal anaesthesia. More effective than spray alone in nasal passages. Leave in place 5–15 minutes."),
("Infected tissue failure", "LA fails in abscesses due to low pH. Aspirate pus first if possible; then inject peripherally or use proximal nerve block technique."),
("Bupivacaine danger", "Unlike other LAs, bupivacaine causes cardiac collapse BEFORE prominent CNS signs. Never exceed safe dose limits. Have Intralipid immediately available."),
("Transtracheal injection timing", "Inject on expiration (not inspiration) so that the resulting cough on inspiration disperses LA throughout the trachea and subglottis."),
("Never infiltrate the RLN directly", "The recurrent laryngeal nerve supplies all intrinsic laryngeal muscles. Direct injection → bilateral palsy → acute airway obstruction."),
("EMLA for TM and nasal procedures", "EMLA (lidocaine + prilocaine) cream applied 30–60 min before myringotomy or nasal procedures reduces discomfort significantly, especially in anxious patients."),
("Succinylcholine interaction", "Ester LAs (especially procaine and chloroprocaine) competitively inhibit plasma cholinesterase. Inform anaesthetist; prolonged neuromuscular blockade may result."),
("Methemoglobinemia monitoring", "Standard pulse oximetry reads ~85% regardless of actual saturation. If methemoglobinemia is suspected (benzocaine/prilocaine use), co-oximetry is mandatory."),
]
for title, content in pearls:
row = Table(
[[Paragraph(f"▸ {title}", S("PearlTitle", fontName="Helvetica-Bold",
fontSize=8.8, textColor=NAVY)),
Paragraph(content, BODY)]],
colWidths=[4.5*cm, doc.width - 4.5*cm]
)
row.setStyle(TableStyle([
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 0),
("VALIGN", (0,0), (-1,-1), "TOP"),
("LINEBELOW", (0,0), (-1,-1), 0.3, colors.HexColor("#D0E4EC")),
]))
story.append(row)
story.append(sp(10))
# ── FOOTER NOTE ─────────────────────────────────────────────────
story.append(hr())
story.append(Paragraph(
"Sources: K.J. Lee's Essential Otolaryngology (11th Ed.) · Cummings Otolaryngology Head and Neck Surgery · "
"Regional & Topical Anaesthesia of Upper Airways (PMC2900072) · AAO-HNS Clinical Guidelines · "
"Regional Anaesthesia in Head and Neck Surgery",
NOTE
))
story.append(Paragraph(
"Compiled by Orris Clinical Reference | July 2026 | For educational use only — always verify doses before clinical application.",
NOTE
))
# ── BUILD ────────────────────────────────────────────────────────
def add_page_number(canvas, doc):
canvas.saveState()
canvas.setFont("Helvetica", 7.5)
canvas.setFillColor(MID_GREY)
canvas.drawString(MARGIN, 12*mm, "Local Anaesthesia in ENT — Reference Guide")
canvas.drawRightString(PAGE_W - MARGIN, 12*mm, f"Page {doc.page}")
canvas.restoreState()
doc.build(story, onFirstPage=add_page_number, onLaterPages=add_page_number)
print("PDF generated successfully:", OUTPUT)
cd /home/daytona/workspace/la-ent-guide && python generate_pdf.py 2>&1
ls -lh /home/daytona/workspace/la-ent-guide/LA_in_ENT_Reference_Guide.pdf
LA in ENT Reference Guide
PDF Document · PDF
| Section | Content |
|---|---|
| 1. Mechanism & Classification | Na-channel blockade, ionisation/pKa, ester vs. amide comparison table |
| 2. Individual Agents | Full drug tables for all esters, amides, and miscellaneous agents (onset, duration, max dose, formulation, ENT use, notes) |
| 3. Vasoconstrictors & Additives | Adrenaline concentrations, NaHCO₃ buffering technique, EMLA use |
| 4. ENT Nerve Blocks | Step-by-step nasal block, EAC ring block, glossopharyngeal/peritonsillar, SPG block, SLN block, transtracheal injection, facial nerve blocks |
| 5. Toxicity & Management | LAST progression table, Intralipid protocol, cardiovascular toxicity, methemoglobinemia, allergy vs. toxic reaction |
| 6. Pharmacokinetics | Absorption by site (larynx = highest risk), metabolism, drug interactions, maximum dose quick reference table |
| 7. Clinical Pearls | 10 practical tips including buffering, cocaine's dual role, EMLA use, RLN warning, timing of transtracheal injection |
Local anaesthesia techniques and applications in ent
local anaesthesia techniques ENT procedures topical infiltration nerve block applications clinical
https://med.libretexts.org/Bookshelves/Anatomy_and_Physiolog…
| Method | How | Best For |
|---|---|---|
| Cotton pledgets / swabs | Soaked in LA, applied to mucosal surface for 5-15 min | Nasal cavity, posterior pharynx, tonsillar pillars |
| Spray / atomizer | Pressurised LA spray directed at mucosa | Oropharynx, larynx, trachea |
| Nebulizer | Inhaled LA mist (e.g., 5 mL of 2% lidocaine) | Diffuse airway - larynx, trachea, bronchi |
| Gargle and swallow | Patient gargles 20% benzocaine or viscous lidocaine | Oropharynx for endoscopy, awake intubation |
| Spray-as-you-go (SAYGO) | LA injected through suction port of fiberoptic scope as it advances | Laryngotracheal anaesthesia during awake FOI |
| EMLA cream | Applied to skin or TM under occlusion, 30-60 min before procedure | Tympanic membrane (myringotomy), nasal skin |
| Transtracheal injection | LA injected through cricothyroid membrane (CTM) | Trachea, subglottis, vocal cords |
Important: Laryngeal and tracheal mucosa absorb LA at near-IV rates. Total lidocaine dose for airway topicalisation is debated - sources cite 4-9 mg/kg. Monitor for LAST (tinnitus, perioral tingling, metallic taste, sedation).
| Type | Technique | ENT Application |
|---|---|---|
| Simple infiltration | Intradermal / subcutaneous injection at site | Minor skin lesions, biopsy, laceration repair |
| Submucosal infiltration | Injection into mucosa along proposed incision | Septoplasty, tonsillectomy, turbinate surgery |
| Subperiosteal infiltration | Injection beneath periosteum along bone | Nasal bone fracture reduction, mastoid surgery |
| Tumescent infiltration | Large volume dilute LA + adrenaline + NaHCO₃ in NS | Scalp/forehead procedures, rhinoplasty |
| Field block | Circumferential ring of LA around operative area | Skin lesions, parotid region, postauricular area |
| Nerve | Origin | Territory |
|---|---|---|
| Auriculotemporal nerve | V3 (mandibular) | Anterior EAC, anterior auricle, tragus, TM (anterior) |
| Greater auricular nerve | C2/C3 (cervical plexus) | Lower 2/3 of auricle, postauricular region |
| Lesser occipital nerve | C2/C3 | Upper posterior auricle |
| Arnold's nerve (auricular branch of vagus) | CN X | Posterior/inferior EAC, concha |
| Auricular branch of facial nerve | CN VII | Posteromedial EAC |
CN VII and CN IX innervate the concha and middle ear mucosa but are not amenable to regional block. Their distributions are reached by local infiltration of the EAC and topical anaesthesia to the middle ear.
| Nerve | Origin | Territory |
|---|---|---|
| Anterior ethmoidal nerve | Nasociliary branch of V1 | Upper/anterior nasal septum, dorsum, lateral wall |
| Posterior ethmoidal nerve | Nasociliary branch of V1 | Upper posterior septum |
| Nasopalatine nerve | V2 via sphenopalatine ganglion | Lower posterior septum, floor |
| Posterior superior lateral nasal nerves | SPG / V2 | Lateral wall (middle, superior turbinates) |
| Anterior superior alveolar nerve | V2 | Anterior floor and vestibule |
| Infraorbital nerve | V2 terminal | Nasal tip, alar, vestibule skin |
| Olfactory nerve (CN I) | Olfactory epithelium | Superior nasal vault |
| Approach | Technique | Agent | Indication |
|---|---|---|---|
| Intranasal topical (preferred) | Cotton-tipped applicators directed to posterior middle meatus at a 45° angle; leave 20-30 min | 4% lidocaine or 10% cocaine | FESS, nasal surgery, cluster headache, migraines |
| Transnasal needle | Endoscopically guided injection into PPF | 1-2 mL 1% lidocaine + epi | Chronic facial pain, post-rhinoplasty analgesia |
| Greater palatine canal | Transoral needle through greater palatine foramen (caution: permanent nerve damage if foramen entered) | 1.5-2 mL 2% lidocaine | Palatal surgery, palatal anaesthesia |
| Landmark | Technique |
|---|---|
| Greater cornu of hyoid bone (preferred) | 25G needle walked anteriorly off the hyoid greater cornu toward the thyrohyoid membrane; advance 1-2 cm until resistance of membrane is felt; aspirate; inject |
| Superior cornu of thyroid cartilage | Same approach using thyroid superior cornu as starting point |
| Thyroid notch | Useful in obese patients where cornu cannot be palpated |
Critical warning: NEVER directly infiltrate the RLN. The RLN supplies all intrinsic laryngeal muscles (except cricothyroid). Bilateral damage = immediate bilateral vocal cord paralysis = acute life-threatening airway obstruction.
| Block | Target | ENT Application |
|---|---|---|
| Infraorbital (V2) | Ala, tip, upper lip, cheek | Rhinoplasty, nasal fracture |
| Supraorbital + supratrochlear (V1) | Forehead, scalp | Brow lift, scalp procedures |
| Mental nerve (V3) | Lower lip, chin | Chin surgery |
| Auriculotemporal (V3) | Temporal region, anterior ear | Temporal/parotid procedures |
| Greater auricular (C2/C3) | Posterior auricle, parotid skin | Parotidectomy LA supplement |
| Drug | Dose | Role |
|---|---|---|
| Midazolam | 1-2 mg IV | Anxiolysis, amnesia |
| Fentanyl | 1-2 mcg/kg IV | Analgesia, sedation |
| Dexmedetomidine | 0.5-1 mcg/kg IV (loading) | Conscious sedation; preserves airway |
| Propofol | 0.5-1 mg/kg IV (titrated) | Deeper sedation |
| ENT Procedure | Preferred LA Technique |
|---|---|
| Nasal endoscopy | Topical: cocaine/oxymetazoline + lidocaine pledgets |
| FESS | Topical pledgets + submucosal infiltration + SPG block |
| Septoplasty | Submucosal infiltration (1% lido + epi) + topical pledgets |
| Nasal fracture reduction | Combined topical pledgets + nerve blocks (infraorbital, nasopalatine, external nasal) |
| Myringotomy / grommets (adult) | EMLA cream on TM 45-60 min before + EAC ring block |
| Tympanoplasty | EAC ring block + postauricular field block + LA infiltration |
| Stapedectomy | EAC ring block + local infiltration under microscopy |
| Peritonsillar abscess drainage | Peritonsillar injection (glossopharyngeal block) |
| Rigid nasopharyngoscopy | Topical nasal spray + benzocaine oropharyngeal spray |
| Awake fiberoptic intubation | Glycopyrrolate + nebulised lidocaine + glossopharyngeal block + SLN block + transtracheal injection |
| Laryngeal biopsy (LA) | SLN block bilateral + transtracheal block + SAYGO |
| Vocal cord injection (LA) | SLN block + transtracheal block |
| Neck dissection (LA/sedation) | Superficial cervical plexus block + LA infiltration |
| Thyroidectomy (LA/sedation) | Superficial + deep cervical plexus block |
Mucociliary clearance , nasal cycle
Acute otitis media