Evidence based treatment for glossopharyngeal neuralgia
glossopharyngeal neuralgia treatment
glossopharyngeal neuralgia evidence based treatment guidelines 2024
PMID: 38575268
https://www.ncbi.nlm.nih.gov/books/NBK541041
glossopharyngeal neuralgia microvascular decompression outcomes
Important caveat: No controlled clinical trials (RCTs) exist for GPN-specific pharmacotherapy. Evidence is extrapolated from trigeminal neuralgia trials and general neuropathic pain data. Treatment is guided by expert consensus and mechanistic rationale (hypersensitive demyelinated fibers generating high-frequency ectopic discharge).
| Drug | Starting Dose | Maintenance | Max Dose | Notes |
|---|---|---|---|---|
| Carbamazepine | 200 mg/day | 400-800 mg/day in 2 divided doses (IR) | 1,200 mg/day | Drug of choice; ~2/3 achieve short-term relief; monitor CBC, LFTs, HLA-B*1502 (SJS risk in Asian patients) |
| Oxcarbazepine | 300 mg/day | 600-1,800 mg/day | 2,400 mg/day | Better tolerated than carbamazepine; fewer drug interactions; useful when carbamazepine not tolerated |
| Gabapentin | 300 mg TID | 1,800-3,600 mg/day | 3,600 mg/day | Evidence from neuropathic pain trials; commonly used |
| Pregabalin | 75 mg BID | 150-600 mg/day | 600 mg/day | Similar mechanism to gabapentin; more predictable absorption |
| TCAs (amitriptyline/nortriptyline) | 10-25 mg at night | 25-150 mg/day | - | Useful especially with comorbid depression/insomnia |
Diagnosis confirmed (ICHD-3 criteria) + MRI to exclude secondary cause
|
v
Step 1: Carbamazepine or Oxcarbazepine (titrate to effect)
|
Partial response → Add gabapentin/pregabalin or baclofen
|
Inadequate control or intolerance
|
v
Step 2: Glossopharyngeal nerve block (diagnostic + therapeutic)
Pulsed RFA or conventional RFA (if poor surgical candidate)
Gamma Knife radiosurgery
|
Continued failure / vascular compression on MRI
|
v
Step 3: Microvascular Decompression (first choice if vascular compression)
Rhizotomy (if no vascular compression or MVD not feasible)
Stylectomy (if Eagle syndrome)
Summarize this treatment guideline into a clinical reference PDF
ls -la /home/daytona/workspace/
mkdir -p /home/daytona/workspace/gpn-reference && python3 -c "import reportlab; …
~/gpn-reference/build_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import mm, cm
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, KeepTogether
)
from reportlab.platypus.flowables import BalancedColumns
from reportlab.lib.colors import HexColor
# ── Colour palette ──────────────────────────────────────────────────────────
DARK_BLUE = HexColor("#1a3a5c")
MED_BLUE = HexColor("#2563a8")
LIGHT_BLUE = HexColor("#dbeafe")
ACCENT = HexColor("#e05c1a")
GREY_BG = HexColor("#f3f4f6")
GREY_RULE = HexColor("#d1d5db")
WHITE = colors.white
BLACK = colors.black
WARN_BG = HexColor("#fef3c7")
WARN_BORDER = HexColor("#d97706")
GREEN_BG = HexColor("#dcfce7")
GREEN_BORDER= HexColor("#16a34a")
W, H = A4
# ── Document ─────────────────────────────────────────────────────────────────
doc = SimpleDocTemplate(
"/home/daytona/workspace/gpn-reference/GPN_Clinical_Reference.pdf",
pagesize=A4,
leftMargin=18*mm, rightMargin=18*mm,
topMargin=20*mm, bottomMargin=20*mm,
title="Glossopharyngeal Neuralgia – Clinical Reference",
author="Orris Clinical Reference",
subject="Evidence-Based Treatment Guidelines"
)
styles = getSampleStyleSheet()
def S(name, **kw):
return ParagraphStyle(name, **kw)
# Custom styles
TITLE_S = S("Title_", fontName="Helvetica-Bold", fontSize=20, textColor=WHITE,
alignment=TA_CENTER, leading=26, spaceAfter=2)
SUBTITLE_S = S("Subtitle_", fontName="Helvetica", fontSize=10, textColor=HexColor("#bfdbfe"),
alignment=TA_CENTER, leading=14, spaceAfter=0)
H1 = S("H1", fontName="Helvetica-Bold", fontSize=12, textColor=WHITE,
backColor=MED_BLUE, leading=16, spaceBefore=10, spaceAfter=4,
leftIndent=0, borderPad=4)
H2 = S("H2", fontName="Helvetica-Bold", fontSize=10, textColor=DARK_BLUE,
leading=14, spaceBefore=8, spaceAfter=3, borderPadding=(0,0,2,0))
BODY = S("Body_", fontName="Helvetica", fontSize=8.5, textColor=BLACK,
leading=13, spaceAfter=3, alignment=TA_JUSTIFY)
BODY_SM = S("Body_sm", fontName="Helvetica", fontSize=8, textColor=BLACK,
leading=12, spaceAfter=2)
BULLET = S("Bullet_", fontName="Helvetica", fontSize=8.5, textColor=BLACK,
leading=13, leftIndent=12, firstLineIndent=-8, spaceAfter=2)
BOLD_SM = S("BoldSm", fontName="Helvetica-Bold", fontSize=8.5, textColor=DARK_BLUE,
leading=13, spaceAfter=1)
CAPTION = S("Caption_", fontName="Helvetica-Oblique", fontSize=7.5,
textColor=HexColor("#6b7280"), alignment=TA_CENTER, leading=11, spaceAfter=4)
WARN_S = S("Warn_", fontName="Helvetica", fontSize=8, textColor=HexColor("#92400e"),
leading=12, leftIndent=6)
FOOTER_S = S("Footer_", fontName="Helvetica", fontSize=7, textColor=HexColor("#9ca3af"),
alignment=TA_CENTER, leading=10)
DRUG_HDR = S("DrugHdr", fontName="Helvetica-Bold", fontSize=8.5, textColor=WHITE,
alignment=TA_CENTER, leading=12)
DRUG_CELL= S("DrugCell", fontName="Helvetica", fontSize=8, textColor=BLACK,
leading=12, alignment=TA_LEFT)
ALGO_STEP= S("AlgoStep", fontName="Helvetica-Bold", fontSize=9, textColor=WHITE,
alignment=TA_CENTER, leading=13)
ALGO_TEXT= S("AlgoText", fontName="Helvetica", fontSize=8, textColor=DARK_BLUE,
leading=12, alignment=TA_CENTER)
ALGO_SUB = S("AlgoSub", fontName="Helvetica-Oblique", fontSize=7.5, textColor=HexColor("#374151"),
leading=11, alignment=TA_CENTER)
story = []
# ════════════════════════════════════════════════════════════════════════════
# HEADER BANNER
# ════════════════════════════════════════════════════════════════════════════
banner_data = [[
Paragraph("GLOSSOPHARYNGEAL NEURALGIA", TITLE_S),
""
],[
Paragraph("Evidence-Based Clinical Reference · July 2026", SUBTITLE_S),
""
]]
banner_table = Table(banner_data, colWidths=[doc.width])
banner_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), DARK_BLUE),
("TOPPADDING", (0,0), (-1,-1), 10),
("BOTTOMPADDING", (0,0), (-1,-1), 8),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 10),
("SPAN", (0,0), (-1,-1)),
]))
# Use simple header paragraphs instead
story.append(Table([[Paragraph("GLOSSOPHARYNGEAL NEURALGIA", TITLE_S)],
[Paragraph("Evidence-Based Clinical Reference · July 2026", SUBTITLE_S)]],
colWidths=[doc.width],
style=[("BACKGROUND",(0,0),(-1,-1),DARK_BLUE),
("TOPPADDING",(0,0),(-1,-1),12),
("BOTTOMPADDING",(0,0),(-1,-1),12),
("LEFTPADDING",(0,0),(-1,-1),12),
("RIGHTPADDING",(0,0),(-1,-1),12)]))
story.append(Spacer(1, 6*mm))
# ════════════════════════════════════════════════════════════════════════════
# KEY FACTS ROW
# ════════════════════════════════════════════════════════════════════════════
def fact_cell(label, value, bg=LIGHT_BLUE):
return [Paragraph(f"<b>{label}</b>", S("fc_l", fontName="Helvetica-Bold", fontSize=7.5,
textColor=DARK_BLUE, alignment=TA_CENTER, leading=11)),
Paragraph(value, S("fc_v", fontName="Helvetica", fontSize=8,
textColor=BLACK, alignment=TA_CENTER, leading=12))]
facts = Table([
[Paragraph("<b>Incidence</b>", S("fi", fontName="Helvetica-Bold", fontSize=7.5, textColor=DARK_BLUE, alignment=TA_CENTER, leading=10)),
Paragraph("<b>Pain Character</b>", S("fi", fontName="Helvetica-Bold", fontSize=7.5, textColor=DARK_BLUE, alignment=TA_CENTER, leading=10)),
Paragraph("<b>Trigger</b>", S("fi", fontName="Helvetica-Bold", fontSize=7.5, textColor=DARK_BLUE, alignment=TA_CENTER, leading=10)),
Paragraph("<b>Cause</b>", S("fi", fontName="Helvetica-Bold", fontSize=7.5, textColor=DARK_BLUE, alignment=TA_CENTER, leading=10)),
Paragraph("<b>Workup</b>", S("fi", fontName="Helvetica-Bold", fontSize=7.5, textColor=DARK_BLUE, alignment=TA_CENTER, leading=10))],
[Paragraph("0.2–0.7/100,000/yr", S("fv", fontName="Helvetica", fontSize=8, textColor=BLACK, alignment=TA_CENTER, leading=11)),
Paragraph("Lancinating, paroxysmal\nseconds–2 min", S("fv", fontName="Helvetica", fontSize=8, textColor=BLACK, alignment=TA_CENTER, leading=11)),
Paragraph("Swallowing, coughing,\nspeaking, laughing", S("fv", fontName="Helvetica", fontSize=8, textColor=BLACK, alignment=TA_CENTER, leading=11)),
Paragraph("Vascular compression\n(PICA most common)", S("fv", fontName="Helvetica", fontSize=8, textColor=BLACK, alignment=TA_CENTER, leading=11)),
Paragraph("MRI brain + neck\n(exclude secondary)", S("fv", fontName="Helvetica", fontSize=8, textColor=BLACK, alignment=TA_CENTER, leading=11))]
], colWidths=[doc.width/5]*5)
facts.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), LIGHT_BLUE),
("BACKGROUND", (0,1), (-1,1), GREY_BG),
("BOX", (0,0), (-1,-1), 0.5, MED_BLUE),
("INNERGRID", (0,0), (-1,-1), 0.3, GREY_RULE),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 4),
("RIGHTPADDING", (0,0), (-1,-1), 4),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
story.append(facts)
story.append(Spacer(1, 5*mm))
# ════════════════════════════════════════════════════════════════════════════
# WARNING BOX
# ════════════════════════════════════════════════════════════════════════════
warn_table = Table([[Paragraph(
"⚠ <b>Evidence Caveat:</b> No RCTs exist for GPN-specific pharmacotherapy. "
"Recommendations are extrapolated from trigeminal neuralgia RCTs and neuropathic pain "
"systematic reviews. Surgical data derive from retrospective case series.",
S("wt", fontName="Helvetica", fontSize=8, textColor=HexColor("#92400e"), leading=12)
)]],
colWidths=[doc.width])
warn_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), WARN_BG),
("BOX", (0,0), (-1,-1), 1, WARN_BORDER),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
]))
story.append(warn_table)
story.append(Spacer(1, 5*mm))
# ════════════════════════════════════════════════════════════════════════════
# SECTION 1 – PHARMACOLOGICAL TREATMENT
# ════════════════════════════════════════════════════════════════════════════
story.append(Table([[Paragraph(" STEP 1 — PHARMACOLOGICAL TREATMENT", H1)]],
colWidths=[doc.width],
style=[("BACKGROUND",(0,0),(-1,-1),MED_BLUE),
("TOPPADDING",(0,0),(-1,-1),5),
("BOTTOMPADDING",(0,0),(-1,-1),5),
("LEFTPADDING",(0,0),(-1,-1),8),
("RIGHTPADDING",(0,0),(-1,-1),8)]))
story.append(Spacer(1, 3*mm))
# Drug table
col_w = [45*mm, 32*mm, 32*mm, 22*mm, doc.width - 131*mm]
drug_hdr_s = S("dh", fontName="Helvetica-Bold", fontSize=8, textColor=WHITE,
alignment=TA_CENTER, leading=11)
drug_cell_s = S("dc", fontName="Helvetica", fontSize=7.8, textColor=BLACK,
leading=12, alignment=TA_LEFT)
drug_cell_c = S("dcc", fontName="Helvetica", fontSize=7.8, textColor=BLACK,
leading=12, alignment=TA_CENTER)
hdr = [Paragraph(t, drug_hdr_s) for t in ["Drug", "Starting Dose", "Maintenance", "Max/day", "Key Notes"]]
rows = [hdr,
[Paragraph("<b>Carbamazepine</b>\n(Drug of choice)", drug_cell_s),
Paragraph("200 mg/day\n(single or divided)", drug_cell_c),
Paragraph("400–800 mg/day\n(2 divided doses)", drug_cell_c),
Paragraph("1,200 mg", drug_cell_c),
Paragraph("Monitor CBC, LFTs. HLA-B*1502 before use in Asian patients (SJS risk). Titrate by 200 mg increments.", drug_cell_s)],
[Paragraph("<b>Oxcarbazepine</b>\n(if CBZ not tolerated)", drug_cell_s),
Paragraph("300 mg/day", drug_cell_c),
Paragraph("600–1,800 mg/day", drug_cell_c),
Paragraph("2,400 mg", drug_cell_c),
Paragraph("Fewer drug interactions than CBZ. Better GI tolerability. Monitor serum sodium (hyponatraemia).", drug_cell_s)],
[Paragraph("<b>Gabapentin</b>", drug_cell_s),
Paragraph("300 mg TID", drug_cell_c),
Paragraph("1,800–3,600 mg/day", drug_cell_c),
Paragraph("3,600 mg", drug_cell_c),
Paragraph("Evidence from neuropathic pain trials. Useful adjunct. Dose-reduce in renal impairment.", drug_cell_s)],
[Paragraph("<b>Pregabalin</b>", drug_cell_s),
Paragraph("75 mg BID", drug_cell_c),
Paragraph("150–600 mg/day", drug_cell_c),
Paragraph("600 mg", drug_cell_c),
Paragraph("More predictable pharmacokinetics than gabapentin. Schedule V (abuse potential). Reduce in renal impairment.", drug_cell_s)],
[Paragraph("<b>Amitriptyline / Nortriptyline</b>\n(TCA)", drug_cell_s),
Paragraph("10–25 mg nightly", drug_cell_c),
Paragraph("25–150 mg/day", drug_cell_c),
Paragraph("150 mg", drug_cell_c),
Paragraph("Useful when comorbid depression or insomnia. Anticholinergic side effects. ECG before use in elderly.", drug_cell_s)],
[Paragraph("<b>Baclofen</b>\n(adjunct)", drug_cell_s),
Paragraph("5 mg TID", drug_cell_c),
Paragraph("30–75 mg/day", drug_cell_c),
Paragraph("80 mg", drug_cell_c),
Paragraph("GABA-B agonist. Combine with CBZ for refractory cases. Taper slowly on discontinuation.", drug_cell_s)],
]
drug_table = Table(rows, colWidths=col_w, repeatRows=1)
drug_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), DARK_BLUE),
("BACKGROUND", (0,1), (-1,1), WHITE),
("BACKGROUND", (0,2), (-1,2), GREY_BG),
("BACKGROUND", (0,3), (-1,3), WHITE),
("BACKGROUND", (0,4), (-1,4), GREY_BG),
("BACKGROUND", (0,5), (-1,5), WHITE),
("BACKGROUND", (0,6), (-1,6), GREY_BG),
("BOX", (0,0), (-1,-1), 0.5, MED_BLUE),
("INNERGRID", (0,0), (-1,-1), 0.3, GREY_RULE),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 5),
("RIGHTPADDING", (0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "TOP"),
("ROWBACKGROUNDS",(0,1),(-1,-1), [WHITE, GREY_BG]),
]))
story.append(drug_table)
story.append(Spacer(1, 3*mm))
# Second line
story.append(Paragraph("Second-Line / Adjunct Agents", H2))
sec_line = Table([[
Paragraph("• <b>Lamotrigine</b> – effective in refractory trigeminal neuralgia; extrapolated to GPN", BULLET),
Paragraph("• <b>NMDA antagonists</b> (ketamine, memantine) – reserved for refractory/intractable cases", BULLET)
],[
Paragraph("• <b>Topical capsaicin</b> – limited evidence; useful for allodynic component", BULLET),
Paragraph("• <b>Opioids</b> – generally not preferred; poor response in paroxysmal neuralgia", BULLET)
]], colWidths=[doc.width/2, doc.width/2])
sec_line.setStyle(TableStyle([("VALIGN",(0,0),(-1,-1),"TOP"),
("TOPPADDING",(0,0),(-1,-1),2),
("BOTTOMPADDING",(0,0),(-1,-1),2)]))
story.append(sec_line)
story.append(Spacer(1, 3*mm))
# Nerve block box
nb_table = Table([[Paragraph(
"✦ <b>Glossopharyngeal Nerve Block</b> (Diagnostic & Therapeutic Bridge)\n"
"Inject local anesthetic (lidocaine/bupivacaine) at tonsillar fossa or under ultrasound guidance. "
"Confirms diagnosis and provides temporary relief while titrating medications. "
"Long-term ultrasound-guided block: 43-case retrospective series showed sustained benefit (You et al., J Pain Res 2024).",
S("nb", fontName="Helvetica", fontSize=8, textColor=HexColor("#1e3a5f"), leading=12)
)]],
colWidths=[doc.width])
nb_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), GREEN_BG),
("BOX", (0,0), (-1,-1), 1, GREEN_BORDER),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
]))
story.append(nb_table)
story.append(Spacer(1, 5*mm))
# ════════════════════════════════════════════════════════════════════════════
# SECTION 2 – INTERVENTIONAL
# ════════════════════════════════════════════════════════════════════════════
story.append(Table([[Paragraph(" STEP 2 — INTERVENTIONAL / MINIMALLY INVASIVE", H1)]],
colWidths=[doc.width],
style=[("BACKGROUND",(0,0),(-1,-1),MED_BLUE),
("TOPPADDING",(0,0),(-1,-1),5),
("BOTTOMPADDING",(0,0),(-1,-1),5),
("LEFTPADDING",(0,0),(-1,-1),8),
("RIGHTPADDING",(0,0),(-1,-1),8)]))
story.append(Spacer(1, 3*mm))
interv_data = [
[Paragraph("Modality", drug_hdr_s), Paragraph("Indication", drug_hdr_s),
Paragraph("Evidence / Outcomes", drug_hdr_s), Paragraph("Notes", drug_hdr_s)],
[Paragraph("<b>Percutaneous RFA</b>\n(conventional)", drug_cell_s),
Paragraph("Failed medications; poor surgical candidate", drug_cell_s),
Paragraph("Systematic review (Do et al., Pain Physician 2024): effective with acceptable safety profile", drug_cell_s),
Paragraph("Thermal lesioning at jugular foramen. Risk: pharyngeal sensory loss.", drug_cell_s)],
[Paragraph("<b>Pulsed RFA</b>\n(ultrasound-guided)", drug_cell_s),
Paragraph("Failed medications; avoid destructive lesion", drug_cell_s),
Paragraph("Frontiers Neurol 2024: significant VAS reduction vs medications at 6 months", drug_cell_s),
Paragraph("Non-destructive; reversible. Preferred in good-prognosis patients.", drug_cell_s)],
[Paragraph("<b>Gamma Knife\nRadiosurgery</b>", drug_cell_s),
Paragraph("Failed medications; not surgical candidate", drug_cell_s),
Paragraph("~70–80% pain relief at 1 year (Stieber et al.); onset delayed weeks–months", drug_cell_s),
Paragraph("Target: cisternal segment CN IX at root entry zone. Repeat treatment possible.", drug_cell_s)],
]
interv_table = Table(interv_data, colWidths=[42*mm, 38*mm, 60*mm, doc.width-140*mm], repeatRows=1)
interv_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), DARK_BLUE),
("ROWBACKGROUNDS",(0,1),(-1,-1), [WHITE, GREY_BG, WHITE]),
("BOX", (0,0), (-1,-1), 0.5, MED_BLUE),
("INNERGRID", (0,0), (-1,-1), 0.3, GREY_RULE),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 5),
("RIGHTPADDING", (0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(interv_table)
story.append(Spacer(1, 5*mm))
# ════════════════════════════════════════════════════════════════════════════
# SECTION 3 – SURGICAL
# ════════════════════════════════════════════════════════════════════════════
story.append(Table([[Paragraph(" STEP 3 — SURGICAL TREATMENT", H1)]],
colWidths=[doc.width],
style=[("BACKGROUND",(0,0),(-1,-1),MED_BLUE),
("TOPPADDING",(0,0),(-1,-1),5),
("BOTTOMPADDING",(0,0),(-1,-1),5),
("LEFTPADDING",(0,0),(-1,-1),8),
("RIGHTPADDING",(0,0),(-1,-1),8)]))
story.append(Spacer(1, 3*mm))
surg_data = [
[Paragraph("Procedure", drug_hdr_s), Paragraph("Indication", drug_hdr_s),
Paragraph("Outcomes", drug_hdr_s), Paragraph("Risks / Notes", drug_hdr_s)],
[Paragraph("<b>Microvascular\nDecompression (MVD)</b>\n— PREFERRED", drug_cell_s),
Paragraph("Vascular compression on MRI; failed medical/interventional Rx", drug_cell_s),
Paragraph("Complete relief: 64–75%\nSubstantial improvement: +16–25%\nSampson 2004 (n=47): 98% immediate relief\nWeiger 2026 meta-analysis: confirms favorable outcomes", drug_cell_s),
Paragraph("Retrosigmoid craniotomy. Teflon sponge between PICA and CN IX. Preserves nerve function. Endoscopic approach emerging.", drug_cell_s)],
[Paragraph("<b>Intracranial\nRhizotomy</b>", drug_cell_s),
Paragraph("No vascular compression; MVD not feasible", drug_cell_s),
Paragraph("'Almost always produces complete pain relief' (Bradley & Daroff's)", drug_cell_s),
Paragraph("Section CN IX + upper CN X rootlets. Risks: pharyngeal sensory loss, dysphagia, hoarseness.", drug_cell_s)],
[Paragraph("<b>Percutaneous\nRhizotomy</b>\n(extracranial)", drug_cell_s),
Paragraph("Cannot tolerate open craniotomy; essential GPN refractory to meds", drug_cell_s),
Paragraph("Good outcomes in selected patients; less data than intracranial approaches", drug_cell_s),
Paragraph("Jugular foramen approach. Lower morbidity than open surgery.", drug_cell_s)],
[Paragraph("<b>Stylectomy</b>", drug_cell_s),
Paragraph("Eagle syndrome (elongated styloid process) confirmed", drug_cell_s),
Paragraph("Curative for Eagle syndrome-related GPN", drug_cell_s),
Paragraph("Must exclude all central causes first.", drug_cell_s)],
]
surg_table = Table(surg_data, colWidths=[42*mm, 40*mm, 58*mm, doc.width-140*mm], repeatRows=1)
surg_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), DARK_BLUE),
("ROWBACKGROUNDS",(0,1),(-1,-1), [WHITE, GREY_BG, WHITE, GREY_BG]),
("BOX", (0,0), (-1,-1), 0.5, MED_BLUE),
("INNERGRID", (0,0), (-1,-1), 0.3, GREY_RULE),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 5),
("RIGHTPADDING", (0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "TOP"),
("FONTNAME", (0,1), (0,1), "Helvetica-Bold"),
]))
story.append(surg_table)
story.append(Spacer(1, 5*mm))
# ════════════════════════════════════════════════════════════════════════════
# TREATMENT ALGORITHM
# ════════════════════════════════════════════════════════════════════════════
story.append(Table([[Paragraph(" TREATMENT ALGORITHM", H1)]],
colWidths=[doc.width],
style=[("BACKGROUND",(0,0),(-1,-1),DARK_BLUE),
("TOPPADDING",(0,0),(-1,-1),5),
("BOTTOMPADDING",(0,0),(-1,-1),5),
("LEFTPADDING",(0,0),(-1,-1),8),
("RIGHTPADDING",(0,0),(-1,-1),8)]))
story.append(Spacer(1, 4*mm))
step_s = S("st", fontName="Helvetica-Bold", fontSize=9, textColor=WHITE,
alignment=TA_CENTER, leading=13)
desc_s = S("ds", fontName="Helvetica", fontSize=8, textColor=DARK_BLUE,
alignment=TA_CENTER, leading=12)
sub_s = S("ss", fontName="Helvetica-Oblique", fontSize=7.5, textColor=HexColor("#374151"),
alignment=TA_CENTER, leading=11)
arr_s = S("ar", fontName="Helvetica-Bold", fontSize=16, textColor=MED_BLUE,
alignment=TA_CENTER, leading=20)
def step_box(step, title, body, sub="", bg=MED_BLUE):
inner = Table([
[Paragraph(f"STEP {step}", step_s)],
[Paragraph(title, S("t2", fontName="Helvetica-Bold", fontSize=9, textColor=WHITE, alignment=TA_CENTER, leading=13))],
[Paragraph(body, desc_s)],
[Paragraph(sub, sub_s)] if sub else [Paragraph("", sub_s)],
], colWidths=[55*mm])
inner.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,1), bg),
("BACKGROUND", (0,2), (-1,-1), HexColor("#f0f7ff")),
("BOX", (0,0), (-1,-1), 1, bg),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 5),
("RIGHTPADDING", (0,0), (-1,-1), 5),
("ALIGN", (0,0), (-1,-1), "CENTER"),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
return inner
algo_row = [
step_box(1, "Pharmacotherapy", "Carbamazepine or\nOxcarbazepine\n± Gabapentin / Pregabalin\n± Baclofen", "Titrate to full effect\nbefore escalating"),
Table([[Paragraph("▶", arr_s)]], colWidths=[18*mm], style=[("ALIGN",(0,0),(-1,-1),"CENTER"),("VALIGN",(0,0),(-1,-1),"MIDDLE")]),
step_box(2, "Nerve Block / RFA", "Glossopharyngeal block\nor Pulsed/conventional RFA\nor Gamma Knife", "If meds fail or not tolerated\nOr poor surgical candidate"),
Table([[Paragraph("▶", arr_s)]], colWidths=[18*mm], style=[("ALIGN",(0,0),(-1,-1),"CENTER"),("VALIGN",(0,0),(-1,-1),"MIDDLE")]),
step_box(3, "Surgery", "MVD (if vascular compression)\nor Rhizotomy\nor Stylectomy (Eagle Sx)", "After imaging confirms etiology", DARK_BLUE),
]
algo = Table([algo_row], colWidths=[55*mm, 18*mm, 55*mm, 18*mm, 55*mm])
algo.setStyle(TableStyle([
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("ALIGN", (0,0), (-1,-1), "CENTER"),
("TOPPADDING", (0,0),(-1,-1),0),
("BOTTOMPADDING", (0,0),(-1,-1),0),
("LEFTPADDING", (0,0),(-1,-1),2),
("RIGHTPADDING", (0,0),(-1,-1),2),
]))
story.append(algo)
story.append(Spacer(1, 3*mm))
# Cardiac syncope note
cardiac_table = Table([[Paragraph(
"★ <b>Special: GPN with Cardiac Syncope</b> — Cardiac pacemaker as temporizing measure; "
"definitive treatment with MVD or rhizotomy to eliminate the cardioinhibitory trigger.",
S("cn", fontName="Helvetica", fontSize=8, textColor=HexColor("#1e3a5f"), leading=12)
)]],
colWidths=[doc.width])
cardiac_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), HexColor("#e0f2fe")),
("BOX", (0,0), (-1,-1), 1, MED_BLUE),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
]))
story.append(cardiac_table)
story.append(Spacer(1, 5*mm))
# ════════════════════════════════════════════════════════════════════════════
# REFERENCES
# ════════════════════════════════════════════════════════════════════════════
story.append(HRFlowable(width="100%", thickness=0.5, color=GREY_RULE))
story.append(Spacer(1, 3*mm))
story.append(Paragraph("Key References", H2))
refs = [
"Goldman-Cecil Medicine, International Edition — Glossopharyngeal Neuralgia section, p. 3821",
"Harrison's Principles of Internal Medicine, 22nd Ed. (2025, McGraw Hill) — CN IX, p. 3599",
"Bradley and Daroff's Neurology in Clinical Practice — Chapter on Cranial Neuralgias",
"Scott-Brown's Otorhinolaryngology Head & Neck Surgery, Vol. 2 — GPN section, p. 1188",
"Allam AK, Larkin MB, Sharma H, Viswanathan A. Trigeminal and Glossopharyngeal Neuralgia. Neurol Clin 2024;42. doi:10.1016/j.ncl.2023.12.011 [PMID 38575268]",
"Weiger VF et al. Keyhole retrosigmoid approach for MVD: systematic review and meta-analysis. Neurosurg Rev 2026. [PMID 41699350]",
"Do K et al. Effectiveness of Radiofrequency Ablation for Glossopharyngeal Neuralgia: Systematic Review. Pain Physician 2024;27(3):97–110.",
"Shah RJ, Padalia D. Glossopharyngeal Neuralgia. StatPearls. NCBI Bookshelf. 2024.",
"You S et al. Long-Term Follow-Up of Ultrasound-Guided Glossopharyngeal Nerve Block: 43 Cases. J Pain Res 2024;17:913–921.",
"Li F et al. Efficacy of ultrasound-guided pulsed radiofrequency in primary GPN. Front Neurol 2024;15:1453598.",
]
for r in refs:
story.append(Paragraph(f"• {r}", BODY_SM))
story.append(Spacer(1, 4*mm))
story.append(HRFlowable(width="100%", thickness=0.5, color=GREY_RULE))
story.append(Spacer(1, 2*mm))
story.append(Paragraph(
"Compiled by Orris Clinical Reference · July 2026 · For educational purposes only. "
"Clinical decisions must be individualised and verified against current institutional guidelines.",
FOOTER_S))
# ════════════════════════════════════════════════════════════════════════════
# BUILD
# ════════════════════════════════════════════════════════════════════════════
doc.build(story)
print("PDF built successfully.")
cd /home/daytona/workspace/gpn-reference && python3 build_pdf.py 2>&1
ls -lh /home/daytona/workspace/gpn-reference/GPN_Clinical_Reference.pdf
GPN Clinical Reference
PDF Document · PDF