Autonomic nervous system and their importance in anaesthesia and tests for both sympathetic and parasympathetic system. Make a pdf with black and white formatting. But use colour for images
mkdir -p /tmp/workspace/ans-anaesthesia && ls /tmp/workspace/
~/ans-anaesthesia/build_pdf.py
#!/usr/bin/env python3
"""Build ANS & Anaesthesia PDF with black/white text formatting and colour images."""
import urllib.request
import os
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, PageBreak, Image, KeepTogether
)
from reportlab.platypus.flowables import HRFlowable
from reportlab.pdfgen import canvas
from io import BytesIO
# ── Download image from URL ──────────────────────────────────────────────────
def download_image(url, filename):
"""Download image and return local path."""
path = f"/tmp/workspace/ans-anaesthesia/{filename}"
try:
req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'})
with urllib.request.urlopen(req, timeout=15) as r:
with open(path, 'wb') as f:
f.write(r.read())
return path
except Exception as e:
print(f"Warning: Could not download {url}: {e}")
return None
# ── Page template with header/footer ─────────────────────────────────────────
class ANSPageTemplate:
def __init__(self, title="Autonomic Nervous System & Anaesthesia"):
self.title = title
def on_page(self, canvas_obj, doc):
canvas_obj.saveState()
w, h = A4
# Header bar
canvas_obj.setFillColor(colors.black)
canvas_obj.rect(0, h - 22*mm, w, 22*mm, fill=1, stroke=0)
canvas_obj.setFont("Helvetica-Bold", 11)
canvas_obj.setFillColor(colors.white)
canvas_obj.drawString(15*mm, h - 14*mm, self.title)
canvas_obj.setFont("Helvetica", 9)
canvas_obj.drawRightString(w - 15*mm, h - 14*mm, "Anaesthesia Reference")
# Footer bar
canvas_obj.setFillColor(colors.black)
canvas_obj.rect(0, 0, w, 12*mm, fill=1, stroke=0)
canvas_obj.setFont("Helvetica", 8)
canvas_obj.setFillColor(colors.white)
canvas_obj.drawString(15*mm, 4*mm, "Sources: Barash Clinical Anesthesia 9e | Guyton & Hall Medical Physiology | Adams & Victor Neurology | Harrison's IM 22E")
canvas_obj.drawRightString(w - 15*mm, 4*mm, f"Page {doc.page}")
canvas_obj.restoreState()
# ── Styles ────────────────────────────────────────────────────────────────────
def make_styles():
styles = {}
styles['cover_title'] = ParagraphStyle(
'CoverTitle',
fontName='Helvetica-Bold',
fontSize=28,
leading=34,
alignment=TA_CENTER,
textColor=colors.white,
spaceAfter=8,
)
styles['cover_sub'] = ParagraphStyle(
'CoverSub',
fontName='Helvetica',
fontSize=14,
leading=20,
alignment=TA_CENTER,
textColor=colors.white,
spaceAfter=4,
)
styles['h1'] = ParagraphStyle(
'H1',
fontName='Helvetica-Bold',
fontSize=16,
leading=20,
textColor=colors.white,
backColor=colors.black,
spaceBefore=14,
spaceAfter=6,
leftIndent=4,
rightIndent=4,
borderPad=4,
)
styles['h2'] = ParagraphStyle(
'H2',
fontName='Helvetica-Bold',
fontSize=13,
leading=17,
textColor=colors.black,
spaceBefore=10,
spaceAfter=4,
borderWidth=0,
borderColor=colors.black,
borderPadding=(0, 0, 2, 0),
)
styles['h3'] = ParagraphStyle(
'H3',
fontName='Helvetica-BoldOblique',
fontSize=11,
leading=14,
textColor=colors.black,
spaceBefore=8,
spaceAfter=3,
)
styles['body'] = ParagraphStyle(
'Body',
fontName='Helvetica',
fontSize=9.5,
leading=14,
alignment=TA_JUSTIFY,
textColor=colors.black,
spaceBefore=3,
spaceAfter=3,
)
styles['bullet'] = ParagraphStyle(
'Bullet',
fontName='Helvetica',
fontSize=9.5,
leading=13,
textColor=colors.black,
leftIndent=14,
firstLineIndent=-10,
spaceBefore=2,
spaceAfter=2,
)
styles['caption'] = ParagraphStyle(
'Caption',
fontName='Helvetica-Oblique',
fontSize=8.5,
leading=12,
alignment=TA_CENTER,
textColor=colors.black,
spaceBefore=4,
spaceAfter=8,
)
styles['table_header'] = ParagraphStyle(
'TableHeader',
fontName='Helvetica-Bold',
fontSize=9,
leading=12,
alignment=TA_CENTER,
textColor=colors.white,
)
styles['table_cell'] = ParagraphStyle(
'TableCell',
fontName='Helvetica',
fontSize=8.5,
leading=12,
textColor=colors.black,
)
styles['box'] = ParagraphStyle(
'Box',
fontName='Helvetica',
fontSize=9,
leading=13,
textColor=colors.black,
backColor=colors.Color(0.92, 0.92, 0.92),
leftIndent=8,
rightIndent=8,
spaceBefore=4,
spaceAfter=4,
borderPad=6,
)
styles['box_title'] = ParagraphStyle(
'BoxTitle',
fontName='Helvetica-Bold',
fontSize=9.5,
leading=14,
textColor=colors.black,
backColor=colors.Color(0.85, 0.85, 0.85),
leftIndent=8,
spaceBefore=4,
spaceAfter=0,
borderPad=4,
)
return styles
# ── Helper builders ──────────────────────────────────────────────────────────
def h1(text, S):
return Paragraph(f" {text}", S['h1'])
def h2(text, S):
p = Paragraph(text, S['h2'])
hr = HRFlowable(width="100%", thickness=1.5, color=colors.black, spaceAfter=3)
return [p, hr]
def h3(text, S):
return Paragraph(text, S['h3'])
def body(text, S):
return Paragraph(text, S['body'])
def bullet(text, S, symbol="•"):
return Paragraph(f"{symbol} {text}", S['bullet'])
def space(n=4):
return Spacer(1, n*mm)
def divider():
return HRFlowable(width="100%", thickness=0.5, color=colors.Color(0.5,0.5,0.5), spaceBefore=6, spaceAfter=6)
def make_table(headers, rows, S, col_widths=None):
th_style = S['table_header']
tc_style = S['table_cell']
header_cells = [Paragraph(h, th_style) for h in headers]
data = [header_cells]
for row in rows:
data.append([Paragraph(str(c), tc_style) for c in row])
ts = TableStyle([
('BACKGROUND', (0, 0), (-1, 0), colors.black),
('TEXTCOLOR', (0, 0), (-1, 0), colors.white),
('ALIGN', (0, 0), (-1, -1), 'CENTER'),
('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
('ROWBACKGROUNDS', (0, 1), (-1, -1), [colors.white, colors.Color(0.93,0.93,0.93)]),
('GRID', (0, 0), (-1, -1), 0.5, colors.Color(0.6,0.6,0.6)),
('LEFTPADDING', (0,0), (-1,-1), 5),
('RIGHTPADDING', (0,0), (-1,-1), 5),
('TOPPADDING', (0,0), (-1,-1), 4),
('BOTTOMPADDING', (0,0), (-1,-1), 4),
])
w = col_widths or [A4[0]/len(headers) - 20] * len(headers)
t = Table(data, colWidths=w)
t.setStyle(ts)
return t
def make_image(path, width_mm=140, caption="", S=None):
if path and os.path.exists(path):
img = Image(path, width=width_mm*mm, height=None) # keep aspect
img.hAlign = 'CENTER'
elems = [space(2), img]
if caption and S:
elems.append(Paragraph(caption, S['caption']))
return elems
return []
# ── Build content ─────────────────────────────────────────────────────────────
def build_content(S, desflurane_img_path):
story = []
page_w = A4[0]
usable_w = page_w - 30*mm # margins
# ─── COVER PAGE ──────────────────────────────────────────────────────────
story.append(Spacer(1, 30*mm))
# Black cover box
cover_data = [[
Paragraph("AUTONOMIC NERVOUS SYSTEM", S['cover_title']),
]]
cover_table = Table(
[[Paragraph("AUTONOMIC NERVOUS SYSTEM\n& ANAESTHESIA", S['cover_title'])]],
colWidths=[usable_w]
)
cover_table.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), colors.black),
('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
('TOPPADDING', (0,0), (-1,-1), 20),
('BOTTOMPADDING', (0,0), (-1,-1), 20),
('LEFTPADDING', (0,0), (-1,-1), 15),
('RIGHTPADDING', (0,0), (-1,-1), 15),
]))
story.append(cover_table)
story.append(space(6))
subtitle_data = [[Paragraph("Anatomy · Physiology · Pharmacology · Clinical Tests", S['cover_sub'])]]
sub_table = Table(subtitle_data, colWidths=[usable_w])
sub_table.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), colors.Color(0.2,0.2,0.2)),
('TOPPADDING', (0,0), (-1,-1), 10),
('BOTTOMPADDING', (0,0), (-1,-1), 10),
]))
story.append(sub_table)
story.append(space(8))
story.append(Paragraph("Compiled for Anaesthesia Study", ParagraphStyle(
'sub2', fontName='Helvetica', fontSize=11, alignment=TA_CENTER, textColor=colors.black, spaceAfter=4)))
story.append(Paragraph("Sources: Barash Clinical Anesthesia 9e | Guyton & Hall Medical Physiology | Adams & Victor Neurology 12e | Harrison's Internal Medicine 22e | Ganong's Review of Medical Physiology 26e", ParagraphStyle(
'sub3', fontName='Helvetica-Oblique', fontSize=8, alignment=TA_CENTER, textColor=colors.Color(0.4,0.4,0.4), spaceAfter=2)))
story.append(space(4))
story.append(Paragraph("July 2026", ParagraphStyle(
'date', fontName='Helvetica', fontSize=9, alignment=TA_CENTER, textColor=colors.black)))
story.append(PageBreak())
# ─── SECTION 1: OVERVIEW ─────────────────────────────────────────────────
story.append(h1("1. OVERVIEW OF THE AUTONOMIC NERVOUS SYSTEM", S))
story.append(space(3))
story.append(body(
"The autonomic nervous system (ANS) is composed of the <b>sympathetic nervous system (SNS)</b>, "
"the <b>parasympathetic nervous system (PNS)</b>, and the <b>enteric nervous system (ENS)</b>. "
"It is sometimes called the <i>involuntary nervous system</i> because it operates without "
"conscious effort. The ANS innervates smooth muscle, cardiac muscle and pacemaker cells, "
"exocrine and endocrine glands, adipose tissue, liver cells, and lymphatic tissue — "
"skeletal muscle being the only innervated tissue not under ANS control.", S))
story.append(body(
"The ultimate responsibility of the ANS is to <b>maintain homeostasis</b> despite perturbations "
"from the external and internal environments. Many prescription drugs exert their actions "
"on elements of the ANS or its effector targets. Changes in autonomic activity contribute to "
"many diseases (e.g., hypertension, heart failure).", S))
story.append(space(4))
*h2_elems, = h2("1.1 Structural Organisation", S)
story.extend(h2_elems)
story.append(body(
"The ANS has a two-neuron efferent pathway: a <b>preganglionic neuron</b> (cell body in CNS) "
"synapses onto a <b>postganglionic neuron</b> (cell body in a ganglion outside the CNS), "
"which then innervates the target organ.", S))
# Comparison table
struct_table = make_table(
["Feature", "Sympathetic", "Parasympathetic"],
[
["Origin (CNS)", "Thoracolumbar (T1–L2/L3)", "Craniosacral (CN III, VII, IX, X; S2–S4)"],
["Preganglionic fibre", "Short (thoracolumbar)", "Long (travels close to target)"],
["Ganglia location", "Paravertebral / prevertebral chain (far from target)", "Terminal ganglia (close to or within target organ)"],
["Postganglionic fibre", "Long (unmyelinated)", "Short (unmyelinated)"],
["Preganglionic NT", "Acetylcholine (nicotinic)", "Acetylcholine (nicotinic)"],
["Postganglionic NT", "Norepinephrine (adrenergic)", "Acetylcholine (muscarinic)"],
["Ratio pre:post", "1:20 (divergent)", "1:1 to 1:3 (focused)"],
["Adrenal medulla", "Modified ganglion — secretes Epi/NE into blood", "Not innervated"],
],
S,
col_widths=[4.5*cm, 6*cm, 6.5*cm]
)
story.append(struct_table)
story.append(space(4))
# ─── SECTION 2: SYMPATHETIC NS ───────────────────────────────────────────
story.append(PageBreak())
story.append(h1("2. SYMPATHETIC NERVOUS SYSTEM", S))
story.append(space(3))
*h2a, = h2("2.1 Anatomy & Pathways", S)
story.extend(h2a)
story.append(body(
"Sympathetic vasomotor nerve fibres leave the spinal cord through <b>all thoracic spinal "
"nerves (T1–T12) and the first one or two lumbar nerves (L1–L2)</b>. They pass immediately into "
"a <b>sympathetic chain</b> (paravertebral ganglia), one lying on each side of the vertebral column. "
"From here they reach circulation by two routes:", S))
story.append(bullet("Specific sympathetic nerves innervating the viscera and heart", S))
story.append(bullet("Peripheral portions of the spinal nerves innervating the peripheral vasculature", S))
story.append(body(
"The innervation of <b>small arteries and arterioles</b> allows sympathetic stimulation to "
"increase vascular resistance and reduce blood flow. The innervation of <b>large veins</b> allows "
"sympathetic stimulation to reduce venous capacitance, pushing blood toward the heart. "
"<b>Capillaries</b> are not innervated.", S))
*h2b, = h2("2.2 Neurotransmitters & Receptors", S)
story.extend(h2b)
receptor_table = make_table(
["Receptor", "Location", "Effect when stimulated"],
[
["α1 (adrenergic)", "Vascular smooth muscle, iris dilator, bladder sphincter", "Vasoconstriction, mydriasis, urinary retention"],
["α2 (adrenergic)", "Presynaptic terminals, platelets, adipose, CNS", "Inhibit NE release, platelet aggregation, sedation"],
["β1 (adrenergic)", "Heart (SA node, AV node, myocardium), kidneys (JGA)", "↑ HR, ↑ contractility, ↑ conduction velocity, renin release"],
["β2 (adrenergic)", "Bronchial SM, vascular SM (skeletal muscle), uterus", "Bronchodilation, vasodilation, uterine relaxation"],
["β3 (adrenergic)", "Adipose tissue, bladder detrusor", "Lipolysis, bladder relaxation"],
["Nicotinic (Nn)", "Adrenal medulla, all autonomic ganglia", "Stimulation of post-ganglionic neuron"],
],
S,
col_widths=[3.5*cm, 6.5*cm, 7*cm]
)
story.append(receptor_table)
story.append(space(4))
*h2c, = h2("2.3 Physiological Effects", S)
story.extend(h2c)
effects_table = make_table(
["Target Organ", "Sympathetic Effect"],
[
["Heart", "↑ HR (chronotropy), ↑ contractility (inotropy), ↑ conduction velocity (dromotropy)"],
["Blood vessels", "Vasoconstriction (α1) → ↑ BP; vasodilation in skeletal muscle (β2)"],
["Lung bronchi", "Bronchodilation (β2)"],
["Liver", "Glycogenolysis, gluconeogenesis → ↑ blood glucose"],
["Adipose tissue", "Lipolysis (β3) → ↑ free fatty acids"],
["Pupils", "Mydriasis — dilation (α1 — iris dilator)"],
["GI tract", "↓ peristalsis, ↑ sphincter tone"],
["Bladder", "Relaxes detrusor (β2), contracts sphincter (α1) → urinary retention"],
["Sweat glands", "↑ sweating (cholinergic — muscarinic)"],
["Adrenal medulla", "Secretes epinephrine (~80%) and norepinephrine (~20%) into bloodstream"],
["Skin/hair", "Piloerection"],
],
S,
col_widths=[5*cm, 12*cm]
)
story.append(effects_table)
# ─── SECTION 3: PARASYMPATHETIC NS ───────────────────────────────────────
story.append(PageBreak())
story.append(h1("3. PARASYMPATHETIC NERVOUS SYSTEM", S))
story.append(space(3))
*h3a, = h2("3.1 Anatomy & Pathways", S)
story.extend(h3a)
story.append(body(
"The parasympathetic (craniosacral) outflow arises from <b>cranial nerves III, VII, IX, X</b> "
"and <b>sacral segments S2–S4</b>. The <b>vagus nerve (CN X)</b> carries approximately "
"75% of all parasympathetic outflow, innervating the heart, lungs, oesophagus, stomach, "
"small intestine, ascending and transverse colon, liver, pancreas, and kidneys.", S))
story.append(body(
"Preganglionic fibres are <b>long</b>; ganglia are located <b>close to or within the target organ</b> "
"(terminal ganglia). Postganglionic fibres are correspondingly short. The neurotransmitter at "
"all parasympathetic synapses (both pre- and postganglionic) is <b>acetylcholine</b>.", S))
# Cranial nerve table
*h3b, = h2("3.2 Cranial Nerve Parasympathetic Outflow", S)
story.extend(h3b)
cn_table = make_table(
["Cranial Nerve", "Ganglion", "Target Organs / Effects"],
[
["CN III (Oculomotor)", "Ciliary ganglion", "Pupil constriction (miosis); accommodation (ciliary muscle)"],
["CN VII (Facial)", "Pterygopalatine + Submandibular ganglia", "Lacrimal, nasal, submandibular, sublingual glands → secretion"],
["CN IX (Glossopharyngeal)", "Otic ganglion", "Parotid gland → salivation"],
["CN X (Vagus)", "Terminal ganglia in walls of target organs", "Heart (↓HR, ↓contractility), lungs (bronchoconstriction), GI (↑motility, sphincter relaxation), pancreas (insulin, digestive enzymes), liver"],
["S2–S4 (Pelvic splanchnic)", "Pelvic ganglia", "Bladder (detrusor contraction), rectum, genitalia (erection via NO)"],
],
S,
col_widths=[3.5*cm, 4.5*cm, 9*cm]
)
story.append(cn_table)
story.append(space(4))
*h3c, = h2("3.3 Physiological Effects", S)
story.extend(h3c)
para_effects = make_table(
["Target Organ", "Parasympathetic Effect"],
[
["Heart", "↓ HR (negative chronotropy via SA node), ↓ AV conduction, slight ↓ contractility"],
["Lungs", "Bronchoconstriction, ↑ secretions"],
["GI tract", "↑ peristalsis, ↑ secretion, relaxation of sphincters"],
["Pancreas", "↑ insulin and digestive enzyme secretion"],
["Bladder", "Detrusor contraction (voiding), sphincter relaxation"],
["Pupils", "Miosis — constriction (muscarinic M3 — sphincter pupillae)"],
["Salivary/lacrimal glands", "↑ secretion (watery)"],
["Penis/clitoris", "Erection (via NO-mediated vasodilation of cavernous vessels)"],
],
S,
col_widths=[5*cm, 12*cm]
)
story.append(para_effects)
# ─── SECTION 4: ANS IN ANAESTHESIA ───────────────────────────────────────
story.append(PageBreak())
story.append(h1("4. IMPORTANCE OF THE ANS IN ANAESTHESIA", S))
story.append(space(3))
story.append(body(
"The ANS is centrally important in anaesthetic practice. Anaesthetic agents alter autonomic "
"tone, reflex arcs, and neurotransmitter release — modifying cardiovascular stability, airway "
"responsiveness, and the endocrine stress response. A firm understanding of ANS pharmacology "
"is essential for safe perioperative management.", S))
*h4a, = h2("4.1 Volatile Anaesthetic Agents & the Sympathetic System", S)
story.extend(h4a)
story.append(body(
"The ANS is modulated by <b>baroreceptor reflex mechanisms</b>. Volatile anaesthetics produce "
"dose-dependent, anesthetic-mediated decreases in reflex control of sympathetic output, most "
"prominent at ≥1 MAC.", S))
story.append(bullet("At ≥1 MAC, there is a greater reduction in reflex compensation to hypovolaemia than at normovolaemia", S))
story.append(bullet("This may allow <b>earlier recognition of blood loss</b> intraoperatively, as there is less masking of hypovolaemia by sympathetic vasoconstriction and tachycardia", S))
story.append(space(3))
story.append(h3("Desflurane — Unique Sympathomimetic Effect", S))
story.append(body(
"Desflurane has a <b>unique and prominent effect on sympathetic outflow</b> not apparent in "
"animal models. With increasing steady-state concentrations, there is a progressive increase "
"in resting sympathetic nervous system activity and plasma norepinephrine levels.", S))
story.append(bullet("When the inspired concentration is rapidly increased (especially above 5–6%), desflurane causes <b>substantial sympathetic activation</b> → hypertension and tachycardia", S))
story.append(bullet("Endocrine response: 15–20-fold increases in plasma ADH, epinephrine, and norepinephrine", S))
story.append(bullet("Haemodynamic response persists <b>4–5 minutes</b>; endocrine response up to <b>30 minutes</b>", S))
story.append(bullet("Adequate opioids or α2-agonist (e.g., dexmedetomidine, clonidine) <b>prior to increasing desflurane concentration</b> can attenuate these responses", S))
story.append(bullet("The source of neuroendocrine activation is likely airway receptors in both upper and lower airways", S))
story.append(space(3))
# Desflurane image
if desflurane_img_path:
story.extend(make_image(
desflurane_img_path, 130,
"Figure: Stress hormone responses to a rapid increase in anaesthetic concentration (4% → 12%). "
"Desflurane caused a markedly larger increase in plasma epinephrine and norepinephrine vs isoflurane. "
"(Source: Barash Clinical Anesthesia 9e, adapted from Weiskopf et al., Anesthesiology 1994)",
S
))
*h4b, = h2("4.2 Drugs Acting on the ANS in Anaesthesia Practice", S)
story.extend(h4b)
drug_table = make_table(
["Drug Class", "Examples", "ANS Target", "Clinical Use"],
[
["α1-agonists", "Phenylephrine, metaraminol", "↑ SVR via α1 vasoconstriction", "Treat hypotension, especially spinal hypotension"],
["α2-agonists", "Clonidine, dexmedetomidine", "↓ SNS outflow (presynaptic inhibition)", "Sedation, analgesia adjunct, attenuate sympathetic responses"],
["β1-blockers", "Metoprolol, esmolol, labetalol", "↓ HR, ↓ contractility", "Rate control, prevent tachycardia, antihypertensive"],
["β-agonists", "Epinephrine, dobutamine", "β1/β2 stimulation", "Cardiac arrest (epi), inotropic support (dobutamine)"],
["Anticholinergics", "Atropine, glycopyrrolate", "Block muscarinic (parasympathetic) receptors", "Bradycardia, reduce secretions, reverse neostigmine"],
["Neostigmine", "Neostigmine", "Anticholinesterase — ↑ ACh at all muscarinic sites", "Reversal of NMB (given with anticholinergic)"],
["Succinylcholine", "Suxamethonium", "Nicotinic receptor at NMJ; also stimulates muscarinic", "Rapid sequence induction — can cause bradycardia"],
["Vasopressin / V1 agonists", "Vasopressin, terlipressin", "V1 receptors on vascular smooth muscle", "Vasoplegic shock, cardiac arrest"],
["Ephedrine", "Ephedrine", "Indirect α1+β1 (releases NE + direct agonism)", "Mixed vasopressor/inotrope for spinal hypotension"],
],
S,
col_widths=[3.5*cm, 4*cm, 5*cm, 4.5*cm]
)
story.append(drug_table)
story.append(space(4))
*h4c, = h2("4.3 Autonomic Reflexes of Perioperative Significance", S)
story.extend(h4c)
reflex_table = make_table(
["Reflex", "Trigger", "Response", "Anaesthetic Relevance"],
[
["Baroreceptor reflex", "↑ or ↓ arterial BP", "Compensatory HR/SVR changes", "Volatile agents depress it → unmasked hypovolaemia"],
["Oculocardiac reflex", "Traction on extraocular muscles / eye pressure", "Profound bradycardia via CN V → CN X arc", "Common in strabismus surgery; treat with atropine / stop stimulus"],
["Laryngospasm", "Airway stimulation (secretions, blood, extubation)", "Glottic closure via CN X (SLN)", "Risk during light anaesthesia; treat with CPAP, propofol, suxamethonium"],
["Vasovagal syncope", "Pain, fear, prolonged standing, surgical stimulation", "Bradycardia + hypotension via vagal dominance", "Regional anaesthesia exacerbates; treat with atropine + leg elevation"],
["Carotid sinus reflex", "Carotid manipulation (carotid endarterectomy, block)", "Bradycardia / hypotension", "Surgical infiltration with LA can blunt it"],
["Bezold-Jarisch reflex", "Ventricular mechanoreceptors activated (hypovolaemia, 5-HT)", "Bradycardia + vasodilation + hypotension", "Spinal/epidural anaesthesia context; treat with ephedrine/atropine"],
],
S,
col_widths=[4*cm, 4.5*cm, 4.5*cm, 4*cm]
)
story.append(reflex_table)
story.append(space(4))
*h4d, = h2("4.4 Regional Anaesthesia & the ANS", S)
story.extend(h4d)
story.append(body(
"Neuraxial (spinal/epidural) anaesthesia produces a <b>sympathetic block</b> proportional to the "
"level of block (typically 2–6 dermatomes higher than the sensory block):", S))
story.append(bullet("Block below <b>T4</b>: loss of lower limb vasoconstriction → ↓ SVR → hypotension", S))
story.append(bullet("Block to/above <b>T4</b>: loss of cardiac accelerator fibres (T1–T4) → bradycardia in addition to hypotension", S))
story.append(bullet("Block to/above <b>T1</b>: total sympathetic block; Horner syndrome (ptosis, miosis, anhidrosis)", S))
story.append(bullet("High block impairs hypoglycaemia recognition (blunts tachycardia response)", S))
story.append(body(
"Stellate ganglion block, coeliac plexus block, and lumbar sympathetic block are used "
"therapeutically for sympathetically-mediated pain, vasospastic conditions, and visceral pain.", S))
*h4e, = h2("4.5 Intraoperative Haemodynamic Events & ANS", S)
story.extend(h4e)
story.append(body(
"Many common intraoperative events are ANS-mediated:", S))
haemo_table = make_table(
["Event", "ANS Mechanism", "Management"],
[
["Hypertension at laryngoscopy", "Sympathetic surge via airway receptors → ↑ NE, ↑ HR, ↑ BP", "Adequate depth; opioid pre-treatment; β-blockers; lidocaine"],
["Intraoperative tachycardia", "Inadequate depth → ↑ SNS or direct vagolysis", "Deepen anaesthesia; esmolol; address cause (hypovolaemia, pain)"],
["Bradycardia", "↑ vagal tone (surgical stimulation, neostigmine, succinylcholine)", "Atropine (600 mcg IV); glycopyrrolate; ephedrine for mixed"],
["Hypotension", "SNS block (neuraxial) or agent-induced depression", "Phenylephrine / ephedrine; IV fluids; vasopressin for refractory"],
["Awareness", "Inadequate SNS suppression → tachycardia, hypertension, sweating", "Increase volatile concentration; add opioid/BZD; monitor depth"],
],
S,
col_widths=[4.5*cm, 6*cm, 6.5*cm]
)
story.append(haemo_table)
# ─── SECTION 5: SYMPATHETIC TESTS ────────────────────────────────────────
story.append(PageBreak())
story.append(h1("5. TESTS OF SYMPATHETIC NERVOUS SYSTEM FUNCTION", S))
story.append(space(3))
story.append(body(
"Sympathetic function tests assess the integrity of the efferent sympathetic pathways, the "
"baroreceptor arc, and end-organ responses. They are clinically important for detecting "
"autonomic neuropathy (diabetic, amyloid, Parkinson-plus syndromes) and for perioperative "
"risk stratification.", S))
*h5a, = h2("5.1 Cardiovascular Sympathetic Tests", S)
story.extend(h5a)
story.append(h3("a. Valsalva Manoeuvre — Sympathetic Component", S))
story.append(body(
"The subject exhales into a manometer against resistance for <b>10 seconds</b>, creating "
"markedly positive intrathoracic pressure. The sharp reduction in venous return drops cardiac "
"output and blood pressure:", S))
story.append(bullet("Phase II: ↓ BP → baroreceptor-mediated <b>reflex tachycardia</b> (sympathetic) + peripheral vasoconstriction", S))
story.append(bullet("Phase IV: after release, BP overshoots above baseline (reflex vasoconstriction)", S))
story.append(bullet("<b>Failure of HR to increase during phase II</b> → sympathetic dysfunction", S))
story.append(bullet("<b>Failure of BP overshoot in phase IV</b> → sympathetic vasomotor failure", S))
story.append(bullet("Valsalva ratio (max HR / lowest HR within 30 s of peak) is a composite measure", S))
story.append(body(
"If Valsalva is abnormal but cold pressor is normal → lesion in baroreceptors or "
"afferent nerves. Failure of both tests → efferent sympathetic pathway lesion.", S))
story.append(h3("b. Head-Up Tilt Table Test", S))
story.append(body(
"The patient is strapped to a motorised table and tilted to 60–80° for up to 45 minutes. "
"Beat-to-beat blood pressure (Finapres / arterial line) and ECG are monitored:", S))
story.append(bullet("<b>Normal response</b>: slight ↑ HR, maintained BP via sympathetic vasoconstriction", S))
story.append(bullet("<b>Orthostatic hypotension</b>: ↓ systolic BP ≥20 mmHg or ↓ diastolic BP ≥10 mmHg within 3 minutes — indicates sympathetic failure", S))
story.append(bullet("<b>Neurally-mediated (vasovagal) syncope</b>: paradoxical bradycardia + hypotension after prolonged tilt — distinct from autonomic failure", S))
story.append(bullet("Tilt with isoproterenol or GTN provocation increases sensitivity", S))
story.append(h3("c. Cold Pressor Test", S))
story.append(body(
"The hand is immersed in ice water for <b>1–5 minutes</b>. Normal response: systolic BP "
"↑ 15–20 mmHg, diastolic BP ↑ 10–15 mmHg. The response is mediated by peripheral "
"pain receptors → cortical-hypothalamic-sympathetic pathway. <b>Reduced or absent response</b> "
"indicates a lesion in the efferent limb of the sympathetic reflex arc.", S))
story.append(h3("d. Isometric Handgrip Test", S))
story.append(body(
"Sustained isometric contraction of the forearm muscles for 5 minutes. <b>Normal response</b>: "
"↑ HR and ↑ systolic and diastolic BP by at least <b>15 mmHg</b>. Mediated by muscle "
"metaboreceptors and cortical-hypothalamic mechanisms (does not depend on afferent arc).", S))
story.append(h3("e. Mental Arithmetic Test", S))
story.append(body(
"Performing mental arithmetic in noisy, distracting surroundings causes a mild measurable "
"increase in HR and BP mediated by <b>cortical-hypothalamic pathways</b>. This test does not "
"depend on the afferent limb of the sympathetic reflex arc. Failure of this test combined with "
"an abnormal Valsalva → defect in central or peripheral efferent sympathetic pathways.", S))
*h5b, = h2("5.2 Sudomotor (Sweat Gland) Tests", S)
story.extend(h5b)
story.append(body(
"Sudomotor tests assess the <b>postganglionic sympathetic cholinergic pathway</b> "
"(sweat glands are innervated by sympathetic fibres releasing acetylcholine):", S))
sudo_table = make_table(
["Test", "Method", "What it Detects"],
[
["Quantitative Sudomotor Axon Reflex Test (QSART)", "Iontophoresis of acetylcholine into skin; measures sweat output with sudorometer. Axon reflex via antidromic C-fibre → orthodromic impulse → sweat", "Postganglionic sympathetic cholinergic function; early small-fibre neuropathy"],
["Thermoregulatory Sweat Test (TST)", "Patient in heated chamber (45–50°C); alizarin powder dusted on skin changes colour where sweating occurs", "Qualitative map of sweating; indicates distribution of anhidrosis; sensitive but does not distinguish pre- vs postganglionic"],
["Sympathetic Skin Response (SSR)", "Electrical stimulus (e.g., median nerve); evoked potential recorded from hand/foot. Reflects ionic current in sweat glands", "Postganglionic sudomotor integrity; subject to habituation"],
["Minor's Starch-Iodine Test", "Iodine applied to skin, then starch powder dusted. Sweat turns brown-black. Areas of anhidrosis remain pale", "Qualitative mapping of sweat distribution"],
["Silicone Imprint Method", "Silicone placed on skin; sweat droplets leave imprints counted under microscope", "Quantitative postganglionic test"],
["Electrochemical Skin Conductance (Sudoscan)", "Electrodes measure skin conductance via iontophoresis of Cl- ions through sweat glands", "Sensitive early detection of small-fibre neuropathy; useful in diabetes"],
],
S,
col_widths=[4.5*cm, 6.5*cm, 6*cm]
)
story.append(sudo_table)
story.append(space(4))
*h5c, = h2("5.3 Vasomotor Tests", S)
story.extend(h5c)
story.append(body(
"These tests assess sympathetic adrenergic vasomotor function:", S))
story.append(bullet("<b>Skin temperature mapping</b>: Normal skin temp 31–33°C at room temp 26–27°C. Vasomotor paralysis → vasodilation → ↑ skin temp; vasoconstriction → ↓ skin temp", S))
story.append(bullet("<b>Blood pressure response to Valsalva</b>: Phase IV overshoot reflects sympathetic vasomotor compensation (see above)", S))
story.append(bullet("<b>Beat-to-beat BP during tilt</b>: Assesses sympathetic vasomotor output in response to baroreflex; orthostatic hypotension = failure", S))
*h5d, = h2("5.4 Pharmacological Sympathetic Tests (Pupil)", S)
story.extend(h5d)
story.append(body(
"Pupillary pharmacological tests exploit Cannon's Law of denervation hypersensitivity — "
"the effector organ becomes hypersensitive to its neurotransmitter 2–3 weeks post-denervation:", S))
story.append(bullet("<b>Apraclonidine (0.5%) test for Horner syndrome</b>: Weak α1 agonist. In sympathetic denervation (Horner's), denervation hypersensitivity → miosis reverses to mydriasis. A positive test (mydriasis) confirms Horner's and depends on presence for several days", S))
story.append(bullet("<b>1% Hydroxyamphetamine</b>: Releases stored NE from postganglionic terminals. Failure to dilate → postganglionic lesion (no stored NE). Can distinguish pre- vs postganglionic Horner's", S))
story.append(bullet("<b>4–10% Cocaine solution</b>: Blocks NE reuptake. Normal → mydriasis (NE available). Sympathetic denervation (pre- or postganglionic) → no mydriasis (NE depleted). Used in children where apraclonidine is risky", S))
# ─── SECTION 6: PARASYMPATHETIC TESTS ────────────────────────────────────
story.append(PageBreak())
story.append(h1("6. TESTS OF PARASYMPATHETIC NERVOUS SYSTEM FUNCTION", S))
story.append(space(3))
story.append(body(
"Parasympathetic tests predominantly assess cardiac vagal function, pupillary reflex, "
"and secretomotor activity. They are essential for detecting cardiac autonomic neuropathy "
"(a major predictor of perioperative morbidity in diabetics) and risk of vasovagal syncope.", S))
*h6a, = h2("6.1 Heart Rate Variability Tests (Ewing's Battery)", S)
story.extend(h6a)
story.append(body(
"These bedside cardiovascular reflex tests, described by Ewing et al., assess "
"<b>cardiac vagal (parasympathetic) control</b> of heart rate:", S))
ewing_table = make_table(
["Test", "Method", "Normal Response", "Abnormal"],
[
["Deep Breathing Test (E:I ratio)", "ECG during deep breathing at 6 breaths/min. Calculate E:I ratio = max R-R during expiration / min R-R during inspiration", "E:I ratio ≥1.21 (age-dependent; approaches 1.04 >60 years)", "E:I < 1.1 = definite abnormal; sensitive early indicator of cardiac autonomic neuropathy"],
["Resting HR", "Measure resting HR", "60–100 bpm", "Resting tachycardia (>100) = early parasympathetic denervation"],
["Valsalva Ratio", "Valsalva manoeuvre; ratio = maximum HR during / minimum HR within 30 s after release", "≥1.21 (younger adults)", "< 1.10 = definite abnormal; tests cardiac vagal reflex"],
["30:15 Ratio (Lying to Standing)", "Patient stands from lying; measure R-R interval at beat 30 vs beat 15. R-R30/R-R15 ratio", "≥1.04", "< 1.0 = abnormal; tests vagal withdrawal on standing"],
],
S,
col_widths=[4*cm, 5*cm, 4*cm, 4*cm]
)
story.append(ewing_table)
story.append(space(3))
story.append(body(
"<b>Heart rate variability (HRV) power spectral analysis</b>: Computerised beat-to-beat RR interval "
"analysis. High-frequency (HF) power (0.15–0.4 Hz) reflects respiratory sinus arrhythmia — "
"a measure of vagal tone. Low-frequency (LF) power (0.04–0.15 Hz) reflects baroreflex activity "
"(both sympathetic and vagal). <b>Reduced HF power</b> indicates impaired parasympathetic modulation.", S))
*h6b, = h2("6.2 Valsalva Manoeuvre — Parasympathetic Component", S)
story.extend(h6b)
story.append(body(
"After release of the Valsalva strain, the blood pressure overshoot stimulates baroreceptors "
"→ <b>reflex bradycardia</b> mediated by parasympathetic activation of the SA node:", S))
story.append(bullet("<b>Failure of HR to slow</b> during phase IV BP overshoot → parasympathetic disturbance", S))
story.append(bullet("In patients with autonomic failure, there is no BP overshoot and no compensatory bradycardia", S))
*h6c, = h2("6.3 Pupillary Tests (Parasympathetic)", S)
story.extend(h6c)
story.append(bullet("<b>Pupil light reflex</b>: Direct and consensual constriction. Afferent: CN II (optic). Efferent: CN III (oculomotor) → ciliary ganglion → sphincter pupillae. Loss → CN III palsy (fixed dilated pupil)", S))
story.append(bullet("<b>Pilocarpine 0.1% (dilute)</b>: Normally causes NO change; in parasympathetic denervation (Adie's pupil) → miosis due to denervation hypersensitivity of sphincter pupillae", S))
story.append(bullet("<b>Methacholine test</b>: Cholinergic agonist. In parasympathetic denervation → pupil constriction (supersensitivity)", S))
*h6d, = h2("6.4 Other Parasympathetic Tests", S)
story.extend(h6d)
story.append(bullet("<b>Urodynamics / cystometry</b>: Detrusor contractions mediated by pelvic parasympathetic (S2–S4). Detrusor areflexia → parasympathetic denervation; detrusor hyperreflexia → upper motor neuron lesion", S))
story.append(bullet("<b>Gastrointestinal motility studies</b>: Gastric emptying scintigraphy, colonic transit; delayed = autonomic neuropathy affecting vagal/pelvic parasympathetics", S))
story.append(bullet("<b>Salivary / lacrimal gland testing</b>: Schirmer test (lacrimal production); Saxon test (salivary flow); reduced in parasympathetic neuropathy or dry eye/Sjogren's", S))
# ─── SECTION 7: COMPREHENSIVE COMPARISON TABLE ───────────────────────────
story.append(PageBreak())
story.append(h1("7. SYMPATHETIC vs PARASYMPATHETIC: COMPREHENSIVE SUMMARY", S))
story.append(space(3))
comp_table = make_table(
["Feature", "Sympathetic", "Parasympathetic"],
[
["Also known as", "Thoracolumbar / adrenergic / fight-or-flight", "Craniosacral / cholinergic / rest-and-digest"],
["Outflow", "T1–L2 (thoracolumbar spinal cord)", "CN III, VII, IX, X; S2–S4"],
["Preganglionic NT", "Acetylcholine (nicotinic NNR)", "Acetylcholine (nicotinic NNR)"],
["Postganglionic NT", "Norepinephrine (most); ACh (sweat glands, some vasodilators)", "Acetylcholine (muscarinic MR)"],
["Main receptor (post)", "Adrenoceptors (α1, α2, β1, β2, β3)", "Muscarinic receptors (M1–M5)"],
["Ganglion location", "Para/prevertebral — far from target", "Terminal ganglia — at/in target organ"],
["Fibre length", "Short pre, long post", "Long pre, short post"],
["Divergence", "High (1:20) — mass reflex", "Low (1:1 to 1:3) — discrete, localised"],
["Heart rate", "↑ (SA node — β1)", "↓ (SA/AV node — M2)"],
["Blood pressure", "↑ (vasoconstriction α1)", "Minimal direct effect"],
["Pupils", "Mydriasis (α1 — dilator pupillae)", "Miosis (M3 — sphincter pupillae)"],
["Bronchi", "Bronchodilation (β2)", "Bronchoconstriction + ↑ secretions (M3)"],
["GI motility", "↓ (α2, β2)", "↑ (M3)"],
["Bladder", "Detrusor relaxation + sphincter contraction (retention)", "Detrusor contraction + sphincter relaxation (voiding)"],
["Sweat glands", "↑ secretion (ACh — muscarinic, cholinergic sympathetic)", "No direct role"],
["Lacrimal / salivary", "↓ secretion (thick)", "↑ secretion (watery)"],
["Liver/metabolic", "Glycogenolysis, gluconeogenesis, lipolysis", "Glycogen synthesis"],
["Adrenal medulla", "Secretes Epi (80%) + NE (20%)", "Not innervated"],
["Overall function", "Fight-or-flight: mobilise energy, prepare for action", "Rest-and-digest: conserve energy, maintain basal function"],
],
S,
col_widths=[4.5*cm, 6*cm, 6.5*cm]
)
story.append(comp_table)
# ─── SECTION 8: CLINICAL KEY POINTS ──────────────────────────────────────
story.append(PageBreak())
story.append(h1("8. KEY CLINICAL POINTS FOR ANAESTHESIA", S))
story.append(space(3))
key_items = [
("Pre-operative assessment", [
"Screen diabetic, elderly, and Parkinson's patients for autonomic dysfunction — increased risk of intraoperative haemodynamic instability",
"Ewing's battery (deep breathing test, Valsalva ratio, 30:15 ratio) identifies cardiac autonomic neuropathy",
"Orthostatic hypotension (BP ↓ ≥20/10 mmHg on standing) predicts exaggerated hypotension under neuraxial block",
]),
("Intraoperative vigilance", [
"Volatile agents (especially desflurane at rapid concentration increase) can cause marked sympathetic surges → have attenuation strategy ready",
"Neuraxial block level and sympathetic block level — monitor for bradycardia (cardiac accelerator loss at T4), Horner's (T1)",
"Anticholinergics pre-operatively for procedures with high vagal risk (strabismus, periocular, laparoscopy)",
]),
("Pharmacological principles", [
"Neostigmine must always be paired with glycopyrrolate or atropine — unopposed muscarinic activation causes severe bradycardia, bronchospasm, hypersalivation",
"Dexmedetomidine (α2 agonist) reduces anaesthetic requirements, attenuates sympathetic responses to intubation and surgical stimulation",
"High spinal anaesthesia (above T4): lose cardiac accelerators → bradycardia + hypotension; treat with ephedrine/atropine/epinephrine as appropriate",
]),
("ANS Tests — Quick Reference", [
"SYMPATHETIC: Valsalva (phase II/IV BP), Cold pressor, Handgrip, Tilt table, QSART, TST, SSR, pupil pharmacology (apraclonidine, cocaine, hydroxyamphetamine)",
"PARASYMPATHETIC: Deep breathing E:I ratio, Valsalva ratio, 30:15 ratio, HRV power spectral analysis, Pupil light reflex, dilute pilocarpine, urodynamics",
"Ewing's battery — 5 core bedside tests: resting HR, deep breathing E:I, Valsalva ratio, 30:15 ratio, BP response to standing",
]),
]
for title_text, points in key_items:
box_title = Paragraph(f" {title_text}", S['box_title'])
story.append(box_title)
for pt in points:
box_p = Paragraph(f"• {pt}", S['box'])
story.append(box_p)
story.append(space(3))
# ─── SECTION 9: EWING'S BATTERY SUMMARY ──────────────────────────────────
*h9a, = h2("9. Ewing's Battery of Cardiovascular Autonomic Tests", S)
story.extend(h9a)
story.append(body(
"Ewing et al. (1985) described five bedside cardiovascular tests for diabetic autonomic neuropathy. "
"The battery assesses both parasympathetic (HR-based) and sympathetic (BP-based) function:", S))
ewing_battery = make_table(
["Test", "Measures", "Abnormal Threshold", "Autonomic Division"],
[
["Resting HR", "Baseline vagal tone", "> 100 bpm at rest", "Parasympathetic"],
["Deep breathing E:I ratio", "Respiratory sinus arrhythmia", "< 1.10 (definite) / 1.11–1.20 (borderline)", "Parasympathetic (vagal)"],
["30:15 ratio (stand)", "Vagal re-activation on standing", "< 1.00", "Parasympathetic (vagal)"],
["Valsalva ratio", "Baroreflex cardiac vagal arc", "< 1.10 (definite)", "Parasympathetic (vagal)"],
["BP fall on standing", "Sympathetic vasomotor tone", "Systolic fall ≥ 30 mmHg (definite) / 11–29 (borderline)", "Sympathetic (adrenergic)"],
],
S,
col_widths=[4.5*cm, 5*cm, 4.5*cm, 3*cm]
)
story.append(ewing_battery)
story.append(space(4))
story.append(body(
"Scoring: Each definite abnormal = 1 point; borderline = 0.5 points. Total score ≥2 indicates "
"significant autonomic neuropathy.", S))
story.append(divider())
story.append(space(3))
story.append(Paragraph(
"<i>This document was compiled from Barash's Clinical Anesthesia (9e), "
"Guyton & Hall Medical Physiology, Adams & Victor's Principles of Neurology (12e), "
"Harrison's Principles of Internal Medicine (22e), and Ganong's Review of Medical Physiology (26e). "
"July 2026.</i>",
ParagraphStyle('footer_note', fontName='Helvetica-Oblique', fontSize=8,
textColor=colors.Color(0.4,0.4,0.4), alignment=TA_CENTER)))
return story
# ── Main ──────────────────────────────────────────────────────────────────────
def main():
os.makedirs("/tmp/workspace/ans-anaesthesia", exist_ok=True)
out_path = "/tmp/workspace/ans-anaesthesia/ANS_Anaesthesia.pdf"
# Download images
print("Downloading images...")
desflurane_path = download_image(
"https://cdn.orris.care/cdss_images/64f3f4ff4533f061918ca41e75a0aa79588f702fe7e9d980f3c03ea265911065.png",
"desflurane_catecholamines.png"
)
# Build styles
S = make_styles()
# Page setup
tpl = ANSPageTemplate()
doc = SimpleDocTemplate(
out_path,
pagesize=A4,
leftMargin=15*mm,
rightMargin=15*mm,
topMargin=28*mm,
bottomMargin=18*mm,
title="Autonomic Nervous System & Anaesthesia",
author="Medical Study Reference",
)
story = build_content(S, desflurane_path)
doc.build(story, onFirstPage=tpl.on_page, onLaterPages=tpl.on_page)
print(f"PDF built successfully: {out_path}")
return out_path
if __name__ == "__main__":
main()
cd /tmp/workspace/ans-anaesthesia && python build_pdf.py 2>&1
~/ans-anaesthesia/build_pdf.py
Successfully replaced 1 instance(s) of the string in '/tmp/workspace/ans-anaesthesia/build_pdf.py'
~/ans-anaesthesia/build_pdf.py
Successfully replaced 1 instance(s) of the string in '/tmp/workspace/ans-anaesthesia/build_pdf.py'
cd /tmp/workspace/ans-anaesthesia && python build_pdf.py 2>&1
ANS Anaesthesia
PDF Document · PDF
| Section | Content |
|---|---|
| 1. Overview of the ANS | Definition, three divisions, two-neuron pathway, structural comparison table (sympathetic vs parasympathetic) |
| 2. Sympathetic NS | Thoracolumbar anatomy, receptor table (α1, α2, β1, β2, β3, nicotinic), full physiological effects table |
| 3. Parasympathetic NS | Craniosacral anatomy, CN III/VII/IX/X/S2-4 table, physiological effects table |
| 4. ANS in Anaesthesia | Volatile agents + baroreflex, desflurane's unique sympathomimetic surge (with colour graph from Barash), drug table (phenylephrine, dexmedetomidine, atropine, neostigmine, etc.), perioperative reflex table (oculocardiac, Bezold-Jarisch, vasovagal, etc.), neuraxial sympathetic block levels |
| 5. Sympathetic Tests | Valsalva phases II/IV, tilt table, cold pressor, handgrip, mental arithmetic, QSART, TST, SSR, Minor's starch-iodine, Sudoscan, pupillary pharmacology (apraclonidine, cocaine, hydroxyamphetamine) |
| 6. Parasympathetic Tests | Ewing's battery (deep breathing E:I ratio, Valsalva ratio, 30:15 ratio, HRV), pupil light reflex, dilute pilocarpine/methacholine, urodynamics, Schirmer/Saxon test |
| 7. Comprehensive SNS vs PNS Table | 19-row head-to-head comparison of every major feature |
| 8. Key Clinical Points + Ewing's Battery | Scored battery table, periop checklists, drug principles boxed |