modes of aphasia
modes types of aphasia classification Broca Wernicke
| Feature | Finding |
|---|---|
| Spontaneous speech | Nonfluent, telegraphic |
| Comprehension | Intact (mild difficulty with complex syntax) |
| Repetition | Impaired |
| Associated signs | Right hemiparesis, apraxia |
| Feature | Finding |
|---|---|
| Spontaneous speech | Fluent, paraphasic, jargon |
| Comprehension | Impaired |
| Repetition | Impaired |
| Associated signs | No hemiparesis typically |
| Feature | Finding |
|---|---|
| Spontaneous speech | Mute or nonfluent |
| Comprehension | Impaired |
| Repetition | Impaired |
| Associated signs | Right hemiplegia, hemianopia |
| Feature | Finding |
|---|---|
| Spontaneous speech | Fluent with literal paraphasias |
| Comprehension | Intact |
| Repetition | Severely impaired (hallmark) |
| Associated signs | Apraxia, mild right-sided deficits |
| Aphasia Type | Fluency | Comprehension | Repetition | Key Feature |
|---|---|---|---|---|
| Broca | Non-fluent | Intact | Impaired | Telegraphic speech, right hemiparesis |
| Wernicke | Fluent | Impaired | Impaired | Jargon/paraphasic, unaware of deficits |
| Global | Non-fluent | Impaired | Impaired | All modalities affected; dense hemiplegia |
| Conduction | Fluent | Intact | Impaired | Disproportionate repetition deficit |
| Transcortical Motor | Non-fluent | Intact | Preserved | Like Broca but repetition spared |
| Transcortical Sensory | Fluent | Impaired | Preserved | Like Wernicke but repetition spared |
| Mixed Transcortical | Non-fluent | Impaired | Preserved | Echolalia only |
| Anomic | Fluent | Intact | Intact | Word-finding only; mildest |

Create a summary PDF comparing aphasia types side-by-side
ls -la /home/daytona/workspace/ 2>/dev/null || echo "workspace empty or missing"
mkdir -p /home/daytona/workspace/aphasia-pdf && python3 -c "import reportlab; print('reportlab ok')"
~/aphasia-pdf/build_aphasia_pdf.py
from reportlab.lib.pagesizes import A4, landscape
from reportlab.lib import colors
from reportlab.lib.units import cm, mm
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, KeepTogether, PageBreak
)
from reportlab.lib.colors import HexColor
OUTPUT = "/home/daytona/workspace/aphasia-pdf/Aphasia_Types_Comparison.pdf"
# ── Colour palette ──────────────────────────────────────────────────────────
NAVY = HexColor("#1a3a5c")
TEAL = HexColor("#1d7874")
LIGHT_BG = HexColor("#f0f6fb")
ALT_ROW = HexColor("#e8f4f0")
WHITE = colors.white
GREY_LINE = HexColor("#cccccc")
RED_BADGE = HexColor("#c0392b")
GREEN_BADGE = HexColor("#1d7874")
YELLOW_BADGE = HexColor("#d4a017")
ORANGE_BADGE = HexColor("#e67e22")
HEADER_BG = HexColor("#1a3a5c")
SUBHEAD_BG = HexColor("#2e6da4")
doc = SimpleDocTemplate(
OUTPUT,
pagesize=landscape(A4),
leftMargin=1.2*cm, rightMargin=1.2*cm,
topMargin=1.4*cm, bottomMargin=1.4*cm
)
styles = getSampleStyleSheet()
def S(name, **kw):
return ParagraphStyle(name, **kw)
title_style = S("Title", fontSize=20, fontName="Helvetica-Bold",
textColor=WHITE, alignment=TA_CENTER, spaceAfter=4)
subtitle_style = S("Subtitle", fontSize=10, fontName="Helvetica",
textColor=HexColor("#aaccee"), alignment=TA_CENTER)
section_head = S("SectionHead", fontSize=13, fontName="Helvetica-Bold",
textColor=NAVY, spaceBefore=10, spaceAfter=4)
cell_head = S("CellHead", fontSize=8, fontName="Helvetica-Bold",
textColor=WHITE, alignment=TA_CENTER)
cell_body = S("CellBody", fontSize=7.5, fontName="Helvetica",
textColor=HexColor("#1a1a1a"), leading=11, alignment=TA_LEFT)
cell_body_c = S("CellBodyC", fontSize=7.5, fontName="Helvetica",
textColor=HexColor("#1a1a1a"), leading=11, alignment=TA_CENTER)
note_style = S("Note", fontSize=7, fontName="Helvetica-Oblique",
textColor=HexColor("#555555"), alignment=TA_CENTER)
badge_style = S("Badge", fontSize=7.5, fontName="Helvetica-Bold",
textColor=WHITE, alignment=TA_CENTER)
legend_style = S("Legend", fontSize=8, fontName="Helvetica",
textColor=HexColor("#333333"))
# ── Helper: coloured badge cell ─────────────────────────────────────────────
def badge(text, bg):
return Paragraph(f"<b>{text}</b>", ParagraphStyle(
"b", fontSize=7.5, fontName="Helvetica-Bold",
textColor=WHITE, alignment=TA_CENTER
))
def P(text, style=None):
if style is None:
style = cell_body
return Paragraph(text, style)
def PC(text):
return Paragraph(text, cell_body_c)
# ── Page 1: Main Comparison Table (all 8 types) ─────────────────────────────
# Columns: Aphasia | Zone | Fluency | Comprehension | Repetition | Naming | Reading | Writing | Associated Signs | Key Feature
COL_WIDTHS = [2.5*cm, 2.7*cm, 2.0*cm, 2.5*cm, 2.5*cm, 2.0*cm, 2.0*cm, 2.0*cm, 3.8*cm, 3.8*cm]
HEADERS = [
P("Aphasia Type", cell_head),
P("Lesion / Zone", cell_head),
P("Fluency", cell_head),
P("Comprehension", cell_head),
P("Repetition", cell_head),
P("Naming", cell_head),
P("Reading", cell_head),
P("Writing", cell_head),
P("Associated Signs", cell_head),
P("Key Feature / Mnemonic", cell_head),
]
# badge colours: ✓ green, ✗ red, ~ orange
OK = lambda: badge("✓ Intact", GREEN_BADGE)
BAD = lambda: badge("✗ Impaired", RED_BADGE)
VAR = lambda: badge("~ Variable", ORANGE_BADGE)
PRES = lambda: badge("✓ Preserved", GREEN_BADGE)
rows_data = [
# 1 Broca
[
P("<b>Broca</b>\n(Non-fluent / Expressive)", cell_body),
P("Post. inferior frontal gyrus\n(BA 44, 45)\nUpper MCA", cell_body),
badge("Non-fluent", RED_BADGE),
OK(),
BAD(),
BAD(),
BAD(),
BAD(),
P("• Right hemiparesis\n• Right hemisensory loss\n• Limb apraxia", cell_body),
P("Telegraphic / agrammatic speech\n\"wife come hospital\"\nDepression common; patient aware", cell_body),
],
# 2 Wernicke
[
P("<b>Wernicke</b>\n(Fluent / Receptive)", cell_body),
P("Post. superior temporal\ngyrus (BA 22)\nLower MCA", cell_body),
badge("Fluent", GREEN_BADGE),
BAD(),
BAD(),
BAD(),
BAD(),
VAR(),
P("• No hemiparesis (usually)\n• Superior quadrantanopia\n• Right hemianopia", cell_body),
P("Jargon / paraphasic speech\nPatient unaware of errors\nNeologisms, logorrhea", cell_body),
],
# 3 Global
[
P("<b>Global</b>\n(Most severe)", cell_body),
P("Entire left MCA territory\n(frontal + temporal\n+ parietal)", cell_body),
badge("Non-fluent", RED_BADGE),
BAD(),
BAD(),
BAD(),
BAD(),
BAD(),
P("• Dense right hemiplegia\n• Hemisensory loss\n• Hemianopia", cell_body),
P("ALL modalities impaired\nBroca + Wernicke combined\nEvolution toward Broca if STG spared", cell_body),
],
# 4 Conduction
[
P("<b>Conduction</b>", cell_body),
P("Arcuate fasciculus\n(Supramarginal gyrus\n/ Insula)", cell_body),
badge("Fluent", GREEN_BADGE),
OK(),
BAD(),
BAD(),
VAR(),
VAR(),
P("• Mild right hemiparesis\n• Right hemisensory loss\n• Limb apraxia", cell_body),
P("REPETITION disproportionately bad\nConduite d'approche\n(repeated self-correction attempts)", cell_body),
],
# 5 Transcortical Motor
[
P("<b>Transcortical Motor</b>\n(TC Motor)", cell_body),
P("Anterior/superior to\nBroca area\n(Watershed zone)", cell_body),
badge("Non-fluent", RED_BADGE),
OK(),
PRES(),
BAD(),
VAR(),
VAR(),
P("• Mild right-sided signs\n• SMA involvement", cell_body),
P("Like Broca BUT repetition spared\nEcholalia; patients can complete\nfamiliar phrases", cell_body),
],
# 6 Transcortical Sensory
[
P("<b>Transcortical Sensory</b>\n(TC Sensory)", cell_body),
P("Posterior to Wernicke\n(TPO junction)\nPosterior watershed", cell_body),
badge("Fluent", GREEN_BADGE),
BAD(),
PRES(),
BAD(),
BAD(),
VAR(),
P("• No hemiparesis typically\n• Visual field defects", cell_body),
P("Like Wernicke BUT repetition spared\nMay repeat without comprehending", cell_body),
],
# 7 Mixed Transcortical
[
P("<b>Mixed Transcortical</b>\n(Isolation Aphasia)", cell_body),
P("Bilateral watershed\nzones isolating\nperisylvian zone", cell_body),
badge("Non-fluent", RED_BADGE),
BAD(),
PRES(),
BAD(),
BAD(),
BAD(),
P("• Global deficits except\n repetition/echolalia\n• Bilateral signs", cell_body),
P("ONLY repetition preserved\n(echolalia)\nPerisylvian zone intact\nbut isolated", cell_body),
],
# 8 Anomic
[
P("<b>Anomic</b>\n(Mildest form)", cell_body),
P("Angular gyrus or\nTPO junction\n(or residual)", cell_body),
badge("Fluent", GREEN_BADGE),
OK(),
PRES(),
BAD(),
OK(),
OK(),
P("• Often no focal deficits\n• May be residual of other\n aphasias", cell_body),
P("Word-finding difficulty ONLY\nCircumlocution common\n\"thing you use to... cut bread\"", cell_body),
],
]
table_data = [HEADERS] + rows_data
ts = TableStyle([
# Header row
("BACKGROUND", (0,0), (-1,0), HEADER_BG),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,0), 8),
("ALIGN", (0,0), (-1,0), "CENTER"),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("ROWBACKGROUNDS",(0,1),(-1,-1), [WHITE, ALT_ROW]),
("GRID", (0,0), (-1,-1), 0.5, GREY_LINE),
("LEFTPADDING", (0,0), (-1,-1), 4),
("RIGHTPADDING", (0,0), (-1,-1), 4),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0), (-1,-1), 4),
# First column bold background
("BACKGROUND", (0,1), (0,-1), LIGHT_BG),
("FONTNAME", (0,1), (0,-1), "Helvetica-Bold"),
])
main_table = Table(table_data, colWidths=COL_WIDTHS, repeatRows=1)
main_table.setStyle(ts)
# ── Page 2: Anatomy + Bedside Exam + Clinical Pearls ────────────────────────
# Three-column layout using a Table
anatomy_text = [
P("<b>Language Areas & White Matter</b>", section_head),
Spacer(1, 4),
P("<b>Broca Area (BA 44/45):</b> Posterior inferior frontal gyrus. Responsible for speech production and syntactic processing.", cell_body),
Spacer(1,3),
P("<b>Wernicke Area (BA 22):</b> Posterior superior temporal gyrus. Responsible for auditory language comprehension.", cell_body),
Spacer(1,3),
P("<b>Arcuate Fasciculus:</b> White matter tract connecting Wernicke to Broca. Damage → Conduction aphasia.", cell_body),
Spacer(1,3),
P("<b>Angular Gyrus (BA 39):</b> Parietal lobe. Reading, writing, naming. Damage → Anomic or alexia with agraphia.", cell_body),
Spacer(1,3),
P("<b>Supplementary Motor Area (SMA):</b> Superior to Broca. Initiation of speech. Damage → TC Motor aphasia.", cell_body),
Spacer(1,3),
P("<b>Watershed Zones:</b> Border zones between MCA/ACA and MCA/PCA. Ischemia here → Transcortical aphasias.", cell_body),
Spacer(1,6),
P("<b>Vascular Territories</b>", section_head),
Spacer(1,4),
P("• <b>Upper MCA:</b> Broca area → Broca aphasia + right hemiparesis", cell_body),
P("• <b>Lower MCA:</b> Wernicke area → Wernicke aphasia ± hemianopia", cell_body),
P("• <b>Entire MCA:</b> → Global aphasia", cell_body),
P("• <b>ACA/MCA watershed:</b> SMA → TC Motor aphasia", cell_body),
P("• <b>MCA/PCA watershed:</b> TPO junction → TC Sensory aphasia", cell_body),
P("• <b>Bilateral watersheds:</b> → Isolation/Mixed TC aphasia", cell_body),
]
bedside_text = [
P("<b>Bedside Language Examination</b>", section_head),
Spacer(1, 4),
P("<b>1. Spontaneous speech</b> — note fluency, rate, effort, paraphasias, prosody", cell_body),
Spacer(1,3),
P("<b>2. Naming</b> — show objects (pen, watch, coin). Impaired in ALL aphasias.", cell_body),
Spacer(1,3),
P("<b>3. Repetition</b> — key discriminator:", cell_body),
P(" • \"No ifs, ands, or buts\"\n • \"The president lives in Washington\"\n • Single words, then sentences", cell_body),
Spacer(1,3),
P("<b>4. Comprehension</b>", cell_body),
P(" • Yes/No questions (\"Is your name John?\")\n • Single commands → complex multi-step\n • Syntactic comprehension (embedded clauses)", cell_body),
Spacer(1,3),
P("<b>5. Reading</b> — single words, then sentences, both aloud and for comprehension", cell_body),
Spacer(1,3),
P("<b>6. Writing</b> — spontaneous sentence, dictation, copy", cell_body),
Spacer(1,6),
P("<b>Paraphasia Types</b>", section_head),
Spacer(1,4),
P("• <b>Literal/Phonemic:</b> Sound substitution — \"spoon\" → \"spoop\" (Broca, Conduction)", cell_body),
P("• <b>Verbal/Semantic:</b> Word substitution — \"spoon\" → \"fork\" (Wernicke)", cell_body),
P("• <b>Neologism:</b> Non-word — \"spoon\" → \"flarble\" (Wernicke)", cell_body),
P("• <b>Jargon:</b> String of neologisms (severe Wernicke)", cell_body),
P("• <b>Circumlocution:</b> Describing the word — \"the thing for eating soup\" (Anomic)", cell_body),
]
pearls_text = [
P("<b>Clinical Pearls</b>", section_head),
Spacer(1, 4),
P("<b>The Repetition Rule:</b>", cell_body),
P(" Perisylvian zone (Broca/Wernicke/Global/Conduction) → <b>Repetition IMPAIRED</b>", cell_body),
P(" Transcortical / Anomic → <b>Repetition PRESERVED</b>", cell_body),
Spacer(1,5),
P("<b>Fluency + Comprehension + Repetition = Diagnosis:</b>", cell_body),
Spacer(1,3),
P(" NF + Intact + Impaired → <b>Broca</b>", cell_body),
P(" F + Impaired + Impaired → <b>Wernicke</b>", cell_body),
P(" NF + Impaired + Impaired → <b>Global</b>", cell_body),
P(" F + Intact + Impaired → <b>Conduction</b>", cell_body),
P(" NF + Intact + Preserved → <b>TC Motor</b>", cell_body),
P(" F + Impaired + Preserved → <b>TC Sensory</b>", cell_body),
P(" NF + Impaired + Preserved → <b>Mixed TC</b>", cell_body),
P(" F + Intact + Preserved → <b>Anomic</b>", cell_body),
Spacer(1,5),
P("<b>Associated Hemiparesis:</b>", cell_body),
P(" Present → Broca or Global (frontal involvement)", cell_body),
P(" Absent → Wernicke (purely temporal lesion)", cell_body),
P(" Absent → Conduction (parietal/insular lesion)", cell_body),
Spacer(1,5),
P("<b>Awareness of Deficits:</b>", cell_body),
P(" Aware + Frustrated → Broca (depression common)", cell_body),
P(" Unaware → Wernicke (anosognosia)", cell_body),
Spacer(1,5),
P("<b>Recovery Patterns (post-stroke):</b>", cell_body),
P(" • Global often evolves → Broca over weeks-months", cell_body),
P(" • Mild aphasia: 95% peak at 2 weeks", cell_body),
P(" • Moderate aphasia: peak ~6 weeks", cell_body),
P(" • Severe aphasia: peak ~10 weeks", cell_body),
P(" • Only 8% with severe aphasia fully recover by 6 months", cell_body),
Spacer(1,5),
P("<b>Primary Progressive Aphasia (PPA):</b>", cell_body),
P(" Neurodegenerative; worsens over time. Three variants:", cell_body),
P(" 1. Nonfluent/Agrammatic (like Broca)", cell_body),
P(" 2. Semantic (like TC Sensory/Wernicke)", cell_body),
P(" 3. Logopenic (like Conduction)", cell_body),
Spacer(1,5),
P("<b>Source:</b> Bradley & Daroff's Neurology in Clinical Practice, Ch. 13", note_style),
]
# Build three-column layout
def make_col(items):
"""Wrap a list of flowables in a single-cell table to act as a column."""
return items
col_table_data = [[
[x for x in anatomy_text],
[x for x in bedside_text],
[x for x in pearls_text],
]]
# Use a nested approach: each column is itself a list of Paragraphs in a Table cell
col_widths_p2 = [8.5*cm, 8.5*cm, 8.5*cm]
# We'll flatten the three columns into a single 3-col table with the content
from reportlab.platypus import ListFlowable
def col_cells(items):
from io import BytesIO
story = items
return story
page2_col_data = [[anatomy_text, bedside_text, pearls_text]]
page2_table = Table(page2_col_data, colWidths=col_widths_p2)
page2_table.setStyle(TableStyle([
("VALIGN", (0,0), (-1,-1), "TOP"),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
("TOPPADDING", (0,0), (-1,-1), 4),
("LINEAFTER", (0,0), (1,-1), 0.5, GREY_LINE),
]))
# ── Build title banner (as a Table for coloured background) ─────────────────
def title_banner(title_text, subtitle_text):
data = [[
Paragraph(title_text, title_style),
], [
Paragraph(subtitle_text, subtitle_style),
]]
t = Table(data, colWidths=[sum(COL_WIDTHS)])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), NAVY),
("TOPPADDING", (0,0), (-1,-1), 8),
("BOTTOMPADDING", (0,0), (-1,-1), 8),
("LEFTPADDING", (0,0), (-1,-1), 12),
("RIGHTPADDING", (0,0), (-1,-1), 12),
]))
return t
title1 = title_banner(
"Aphasia Types: Side-by-Side Comparison",
"Classification based on Fluency · Comprehension · Repetition | Source: Bradley & Daroff's Neurology in Clinical Practice"
)
title2 = title_banner(
"Aphasia: Anatomy, Bedside Examination & Clinical Pearls",
"Lesion localization · Diagnostic algorithm · Recovery patterns"
)
# ── Assemble story ───────────────────────────────────────────────────────────
story = [
title1,
Spacer(1, 6),
main_table,
Spacer(1, 6),
# Legend row
Table([[
badge("✓ Intact / Preserved", GREEN_BADGE),
Spacer(0.3*cm, 0),
badge("✗ Impaired", RED_BADGE),
Spacer(0.3*cm, 0),
badge("~ Variable", ORANGE_BADGE),
Spacer(0.3*cm, 0),
P("NF = Non-fluent | F = Fluent | MCA = Middle Cerebral Artery | "
"BA = Brodmann Area | TPO = Temporo-Parieto-Occipital | "
"TC = Transcortical | SMA = Supplementary Motor Area | STG = Superior Temporal Gyrus",
note_style),
]], colWidths=[2.5*cm, 0.3*cm, 2.2*cm, 0.3*cm, 2.2*cm, 0.3*cm, None]),
PageBreak(),
title2,
Spacer(1, 8),
page2_table,
]
doc.build(story)
print(f"PDF written to {OUTPUT}")
cd /home/daytona/workspace/aphasia-pdf && python3 build_aphasia_pdf.py 2>&1
~/aphasia-pdf/build_aphasia_pdf.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/aphasia-pdf/build_aphasia_pdf.py'
cd /home/daytona/workspace/aphasia-pdf && python3 build_aphasia_pdf.py 2>&1
Aphasia Types Comparison
PDF Document · PDF