Create a detailed PDF of 'APPROACH TO THE PATIENT AND GENERAL EXAMINATION OF PATIENT'

Reading File
Reading File
Now let me search the medical library for relevant content on this topic.
Finding Sources
Finding Sources
Excellent finds. Now let me read the most comprehensive sources - S Das Manual on Clinical Surgery and Bailey & Love for general examination, plus the cardiology heart book for stepwise physical exam approach.
Reading File
Reading File
Finding Sources
Finding Sources
Reading File
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Reading File
Reading File
Reading File
I now have enough high-quality content from multiple authoritative textbooks. Let me now generate the comprehensive PDF.
Running Command

mkdir -p /tmp/workspace/patient-examination && ls /tmp/workspace/patient-examination/

Writing File

~/patient-examination/generate_pdf.py

from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.platypus import (
    SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
    HRFlowable, PageBreak, ListFlowable, ListItem, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus.flowables import HRFlowable

OUTPUT_PATH = "/tmp/workspace/patient-examination/Approach_to_Patient_General_Examination.pdf"

# ─── Page layout ───────────────────────────────────────────────────────────────
doc = SimpleDocTemplate(
    OUTPUT_PATH,
    pagesize=A4,
    topMargin=2*cm, bottomMargin=2*cm,
    leftMargin=2.2*cm, rightMargin=2.2*cm,
    title="Approach to the Patient & General Examination",
    author="Orris Medical Reference",
    subject="Clinical Medicine"
)

# ─── Colour palette ────────────────────────────────────────────────────────────
DARK_BLUE   = colors.HexColor("#1A3A5C")
MID_BLUE    = colors.HexColor("#2E6DA4")
LIGHT_BLUE  = colors.HexColor("#D6E8F7")
ACCENT      = colors.HexColor("#E8A020")
LIGHT_GRAY  = colors.HexColor("#F5F5F5")
MED_GRAY    = colors.HexColor("#CCCCCC")
TEXT_COLOR  = colors.HexColor("#1A1A1A")
WHITE       = colors.white

# ─── Styles ────────────────────────────────────────────────────────────────────
styles = getSampleStyleSheet()

cover_title = ParagraphStyle(
    "CoverTitle", fontSize=28, leading=34, textColor=WHITE,
    fontName="Helvetica-Bold", alignment=TA_CENTER, spaceAfter=10
)
cover_sub = ParagraphStyle(
    "CoverSub", fontSize=15, leading=20, textColor=colors.HexColor("#C8DCEF"),
    fontName="Helvetica", alignment=TA_CENTER, spaceAfter=6
)
cover_ref = ParagraphStyle(
    "CoverRef", fontSize=9, leading=13, textColor=colors.HexColor("#A0C0E0"),
    fontName="Helvetica-Oblique", alignment=TA_CENTER
)

h1 = ParagraphStyle(
    "H1", fontSize=16, leading=20, textColor=WHITE,
    fontName="Helvetica-Bold", alignment=TA_LEFT,
    spaceBefore=14, spaceAfter=4, leftIndent=0
)
h2 = ParagraphStyle(
    "H2", fontSize=13, leading=17, textColor=DARK_BLUE,
    fontName="Helvetica-Bold", alignment=TA_LEFT,
    spaceBefore=12, spaceAfter=4
)
h3 = ParagraphStyle(
    "H3", fontSize=11, leading=15, textColor=MID_BLUE,
    fontName="Helvetica-Bold", alignment=TA_LEFT,
    spaceBefore=8, spaceAfter=3
)
body = ParagraphStyle(
    "Body", fontSize=10, leading=15, textColor=TEXT_COLOR,
    fontName="Helvetica", alignment=TA_JUSTIFY,
    spaceBefore=3, spaceAfter=3
)
bullet_style = ParagraphStyle(
    "Bullet", fontSize=10, leading=14, textColor=TEXT_COLOR,
    fontName="Helvetica", alignment=TA_LEFT,
    leftIndent=14, spaceBefore=2, spaceAfter=2,
    bulletIndent=4
)
note_style = ParagraphStyle(
    "Note", fontSize=9, leading=13, textColor=colors.HexColor("#4A4A4A"),
    fontName="Helvetica-Oblique", alignment=TA_LEFT,
    leftIndent=10, spaceBefore=2, spaceAfter=2
)
caption_style = ParagraphStyle(
    "Caption", fontSize=8, leading=11, textColor=MID_BLUE,
    fontName="Helvetica-Bold", alignment=TA_CENTER, spaceAfter=4
)

# ─── Helper: section banner ────────────────────────────────────────────────────
def section_banner(text):
    tbl = Table([[Paragraph(text, h1)]], colWidths=[doc.width])
    tbl.setStyle(TableStyle([
        ("BACKGROUND", (0, 0), (-1, -1), DARK_BLUE),
        ("TOPPADDING",    (0, 0), (-1, -1), 8),
        ("BOTTOMPADDING", (0, 0), (-1, -1), 8),
        ("LEFTPADDING",   (0, 0), (-1, -1), 12),
        ("RIGHTPADDING",  (0, 0), (-1, -1), 12),
        ("ROUNDEDCORNERS", [4, 4, 4, 4]),
    ]))
    return tbl

def info_box(text, bg=LIGHT_BLUE, border=MID_BLUE):
    tbl = Table([[Paragraph(text, body)]], colWidths=[doc.width])
    tbl.setStyle(TableStyle([
        ("BACKGROUND",    (0, 0), (-1, -1), bg),
        ("BOX",           (0, 0), (-1, -1), 1.2, border),
        ("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 tbl

def accent_box(title, rows):
    """Two-column key-value highlight box."""
    data = [[Paragraph(f"<b>{k}</b>", body), Paragraph(v, body)] for k, v in rows]
    col_w = [doc.width * 0.35, doc.width * 0.65]
    tbl = Table(data, colWidths=col_w)
    tbl.setStyle(TableStyle([
        ("BACKGROUND",    (0, 0), (0, -1), LIGHT_BLUE),
        ("BACKGROUND",    (1, 0), (1, -1), colors.HexColor("#FAFCFF")),
        ("ROWBACKGROUNDS", (0, 0), (-1, -1), [LIGHT_BLUE, colors.HexColor("#EAF3FC")]),
        ("BOX",           (0, 0), (-1, -1), 1, MID_BLUE),
        ("INNERGRID",     (0, 0), (-1, -1), 0.5, MED_GRAY),
        ("TOPPADDING",    (0, 0), (-1, -1), 5),
        ("BOTTOMPADDING", (0, 0), (-1, -1), 5),
        ("LEFTPADDING",   (0, 0), (-1, -1), 8),
        ("RIGHTPADDING",  (0, 0), (-1, -1), 8),
        ("VALIGN",        (0, 0), (-1, -1), "TOP"),
    ]))
    return tbl

def two_col_table(data, header_row=None):
    col_w = [doc.width * 0.35, doc.width * 0.65]
    rows = []
    if header_row:
        rows.append([Paragraph(f"<b>{h}</b>", body) for h in header_row])
    for k, v in data:
        rows.append([Paragraph(f"<b>{k}</b>", body), Paragraph(v, body)])
    tbl = Table(rows, colWidths=col_w)
    style_cmds = [
        ("BOX",       (0, 0), (-1, -1), 1, MID_BLUE),
        ("INNERGRID", (0, 0), (-1, -1), 0.5, MED_GRAY),
        ("TOPPADDING",    (0, 0), (-1, -1), 5),
        ("BOTTOMPADDING", (0, 0), (-1, -1), 5),
        ("LEFTPADDING",   (0, 0), (-1, -1), 8),
        ("RIGHTPADDING",  (0, 0), (-1, -1), 8),
        ("VALIGN",    (0, 0), (-1, -1), "TOP"),
    ]
    if header_row:
        style_cmds += [
            ("BACKGROUND",  (0, 0), (-1, 0), DARK_BLUE),
            ("TEXTCOLOR",   (0, 0), (-1, 0), WHITE),
            ("FONTNAME",    (0, 0), (-1, 0), "Helvetica-Bold"),
        ]
    else:
        style_cmds += [("ROWBACKGROUNDS", (0, 0), (-1, -1), [LIGHT_BLUE, WHITE])]
    tbl.setStyle(TableStyle(style_cmds))
    return tbl

def bullets(items):
    return [Paragraph(f"• {item}", bullet_style) for item in items]

def hr():
    return HRFlowable(width="100%", thickness=1.2, color=MID_BLUE, spaceAfter=6, spaceBefore=6)

# ─── COVER PAGE ────────────────────────────────────────────────────────────────
def cover_page():
    elems = []
    # top colour block
    cover_data = [[
        Paragraph("APPROACH TO THE PATIENT", cover_title),
        Paragraph("&amp; GENERAL EXAMINATION", cover_title),
        Spacer(1, 0.4*cm),
        Paragraph("A Comprehensive Clinical Reference", cover_sub),
        Spacer(1, 0.3*cm),
        Paragraph("Based on Goldman-Cecil Medicine · Fuster &amp; Hurst's The Heart · Bailey &amp; Love's Surgery · S. Das Manual on Clinical Surgery · Neuroanatomy Through Clinical Cases", cover_ref),
        Spacer(1, 0.5*cm),
        Paragraph("Orris Medical Reference  |  July 2026", cover_ref),
    ]]
    cover_tbl = Table(cover_data, colWidths=[doc.width])
    cover_tbl.setStyle(TableStyle([
        ("BACKGROUND",    (0, 0), (-1, -1), DARK_BLUE),
        ("TOPPADDING",    (0, 0), (-1, -1), 28),
        ("BOTTOMPADDING", (0, 0), (-1, -1), 28),
        ("LEFTPADDING",   (0, 0), (-1, -1), 24),
        ("RIGHTPADDING",  (0, 0), (-1, -1), 24),
    ]))
    elems.append(Spacer(1, 2*cm))
    elems.append(cover_tbl)
    elems.append(Spacer(1, 1*cm))

    # TOC box
    toc_items = [
        ("1.", "Approach to the Patient — Principles"),
        ("2.", "History Taking — Structure & Components"),
        ("3.", "General Appearance & First Impression"),
        ("4.", "Vital Signs — Temperature, Pulse, BP, RR, SpO₂"),
        ("5.", "Systematic General Examination Head to Toe"),
        ("6.", "Examination of Hands, Nails & Peripheral Circulation"),
        ("7.", "Examination of the Head & Neck"),
        ("8.", "Chest & Cardiovascular Examination Overview"),
        ("9.", "Abdominal Examination Overview"),
        ("10.", "Neurological General Examination"),
        ("11.", "Lymph Nodes, Skin & Musculoskeletal Assessment"),
        ("12.", "Assessment, Differential Diagnosis & Plan"),
        ("13.", "Special Populations & Key Clinical Pearls"),
    ]
    toc_data = [[Paragraph(f"<b>{n}</b>", body), Paragraph(desc, body)] for n, desc in toc_items]
    toc_tbl = Table(toc_data, colWidths=[doc.width * 0.1, doc.width * 0.9])
    toc_tbl.setStyle(TableStyle([
        ("ROWBACKGROUNDS", (0, 0), (-1, -1), [LIGHT_BLUE, WHITE]),
        ("BOX",       (0, 0), (-1, -1), 1, MID_BLUE),
        ("INNERGRID", (0, 0), (-1, -1), 0.3, MED_GRAY),
        ("TOPPADDING",    (0, 0), (-1, -1), 4),
        ("BOTTOMPADDING", (0, 0), (-1, -1), 4),
        ("LEFTPADDING",   (0, 0), (-1, -1), 8),
        ("RIGHTPADDING",  (0, 0), (-1, -1), 8),
    ]))

    toc_header = Table([[Paragraph("<b>TABLE OF CONTENTS</b>", ParagraphStyle("TOCHead",
        fontSize=12, fontName="Helvetica-Bold", textColor=WHITE, alignment=TA_CENTER))]],
        colWidths=[doc.width])
    toc_header.setStyle(TableStyle([
        ("BACKGROUND",    (0, 0), (-1, -1), MID_BLUE),
        ("TOPPADDING",    (0, 0), (-1, -1), 7),
        ("BOTTOMPADDING", (0, 0), (-1, -1), 7),
    ]))
    elems.append(toc_header)
    elems.append(toc_tbl)
    elems.append(PageBreak())
    return elems

# ─── CONTENT ───────────────────────────────────────────────────────────────────
story = []
story += cover_page()

# ═══ SECTION 1: APPROACH TO THE PATIENT — PRINCIPLES ══════════════════════════
story.append(section_banner("1. APPROACH TO THE PATIENT — PRINCIPLES"))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph(
    "The clinical encounter is the foundation of medical practice. Every clinician must develop a "
    "systematic, reproducible approach to each patient — one that is thorough, empathetic, and "
    "efficient. The goal is to gather sufficient information through history, examination, and "
    "investigations to reach a diagnosis and formulate a management plan.",
    body
))
story.append(Spacer(1, 0.2*cm))
story.append(info_box(
    "<b>Core Principle (Goldman-Cecil Medicine):</b> \"Care of the patient is guided by integration "
    "of the chief complaint, history, vital signs, and findings on physical examination. Physicians "
    "should be keenly aware of a patient's vital signs, because they are important markers of "
    "clinical stability.\""
))
story.append(Spacer(1, 0.3*cm))

story.append(Paragraph("The Five Pillars of Patient Assessment", h2))
pillar_data = [
    ("Chief Complaint", "The primary symptom or reason for the patient's presentation, stated in their own words."),
    ("History", "A structured account of the present illness, past medical/surgical history, medications, allergies, family & social history."),
    ("Vital Signs", "Temperature, pulse, blood pressure, respiratory rate, oxygen saturation — objective markers of physiologic stability."),
    ("Physical Examination", "A systematic head-to-toe inspection, palpation, percussion, and auscultation."),
    ("Assessment & Plan", "Integration of all data into a diagnosis (or differential) and a management strategy."),
]
story.append(two_col_table(pillar_data, header_row=["Pillar", "Description"]))
story.append(Spacer(1, 0.4*cm))

story.append(Paragraph("Key Principles from Fuster & Hurst's The Heart (15th Ed.)", h3))
story.append(Paragraph(
    "Each clinician needs to develop his or her own stepwise approach to the cardiovascular "
    "examination — and by extension, all physical examinations. The initial history should be "
    "taken with the patient fully dressed to allow a one-to-one relationship to be built. "
    "For a comprehensive physical examination, the patient must be undressed with an appropriate "
    "gown. An examination should <b>never</b> be done by placing the stethoscope under a shirt or "
    "blouse; full inspection of the chest and extremities is always necessary.",
    body
))
story.append(Spacer(1, 0.5*cm))

# ═══ SECTION 2: HISTORY TAKING ══════════════════════════════════════════════
story.append(section_banner("2. HISTORY TAKING — STRUCTURE & COMPONENTS"))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph(
    "A thorough history is the single most important diagnostic tool. Studies show that in the "
    "majority of cases, a diagnosis can be made from history alone. The history must be systematic, "
    "complete, and documented in a standard order.",
    body
))
story.append(Spacer(1, 0.2*cm))

story.append(Paragraph("A. Identifying Data & Chief Complaint", h2))
story.append(Paragraph(
    "Begin every history with identifying data: patient's name, age, sex, occupation, "
    "and source of referral. The chief complaint (CC) is the main symptom in the patient's own "
    "words, e.g., 'chest pain for 2 hours.' Always record its duration.",
    body
))

story.append(Paragraph("B. History of Present Illness (HPI) — SOCRATES Framework", h2))
socrates_data = [
    ("S — Site",         "Where is the problem? Does it radiate anywhere?"),
    ("O — Onset",        "When did it start? Was onset sudden or gradual?"),
    ("C — Character",    "What is the quality? (Sharp, dull, burning, colicky, throbbing)"),
    ("R — Radiation",    "Does it spread? (E.g., angina radiating to the left arm/jaw)"),
    ("A — Associations", "Associated symptoms? (Nausea, sweating, dyspnoea, etc.)"),
    ("T — Time course",  "Constant or intermittent? Getting better or worse?"),
    ("E — Exacerbating/Relieving", "What makes it worse or better? (Exercise, rest, food, position)"),
    ("S — Severity",     "Score 1–10. How does it affect daily activities?"),
]
story.append(two_col_table(socrates_data, header_row=["Component", "Key Questions"]))
story.append(Spacer(1, 0.3*cm))

story.append(Paragraph("C. Past Medical & Surgical History (PMH/PSH)", h2))
story += bullets([
    "Previous illnesses, hospitalisations, operations, procedures",
    "Childhood illnesses (rheumatic fever, measles, pertussis)",
    "Trauma, accidents",
    "Obstetric history in women (G×P×, complications, menstrual history)",
    "Psychiatric history"
])

story.append(Paragraph("D. Medications & Allergies", h2))
story += bullets([
    "Current medications: name, dose, frequency, duration, compliance",
    "Over-the-counter drugs, herbal/complementary medicines",
    "Drug allergies: document the reaction type (rash, anaphylaxis, intolerance)",
    "Vaccinations and immunisation history"
])

story.append(Paragraph("E. Family History", h2))
story += bullets([
    "First-degree relatives: parents, siblings, children",
    "Heritable conditions: coronary artery disease, diabetes, hypertension, cancer, stroke",
    "Genetic disorders, consanguinity in some populations",
    "Note age and cause of death of parents if deceased"
])

story.append(Paragraph("F. Social & Personal History", h2))
story += bullets([
    "Smoking: pack-year history (packs/day × years)",
    "Alcohol: units per week; CAGE questionnaire if indicated",
    "Recreational/illicit drug use (non-judgmentally)",
    "Occupation and occupational exposures (asbestos, silica, radiation)",
    "Marital/relationship status, living conditions, social support",
    "Travel history (tropical infections, endemic diseases)",
    "Sexual history (orientation, partners, protected sex, STI screening)",
    "Military service history (exposures, injuries, PTSD risk)"
])

story.append(Spacer(1, 0.3*cm))
story.append(info_box(
    "<b>Clinical Pearl:</b> The social history often unlocks diagnoses that the rest of the history "
    "misses. Occupation, travel, and substance use are frequently under-elicited. The [CDC "
    "guidelines] recommend routinely collecting sexual orientation and gender identity "
    "data to improve care equity."
))
story.append(Spacer(1, 0.5*cm))

# ═══ SECTION 3: GENERAL APPEARANCE ══════════════════════════════════════════
story.append(section_banner("3. GENERAL APPEARANCE & FIRST IMPRESSION"))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph(
    "Before touching the patient, spend 30–60 seconds observing their overall appearance. "
    "This 'end-of-bed' assessment can yield critical diagnostic information instantly.",
    body
))
story.append(Spacer(1, 0.2*cm))
story.append(info_box(
    "<b>Goldman-Cecil Medicine:</b> \"Clinicians should never forget that the most important vital sign "
    "is what the patient looks like; general appearance is a sign that guides the intensity and "
    "urgency of the evaluation.\""
))
story.append(Spacer(1, 0.3*cm))

story.append(Paragraph("End-of-Bed Observations", h2))
appear_data = [
    ("Level of consciousness", "Alert, drowsy, confused, stuporous, comatose (use GCS)"),
    ("Distress / discomfort",  "Acute distress, pain grimacing, laboured breathing, agitation"),
    ("Body habitus",           "Obese, cachectic, well-nourished; BMI estimation; muscular wasting"),
    ("Posture",                "Sitting forward (cardiac tamponade, pericarditis, COPD), writhing (colic), rigid (peritonitis)"),
    ("Skin colour",            "Pale (anaemia/shock), jaundiced, cyanosed, flushed, ashen, mottled"),
    ("Dysmorphic features",    "Syndromic features: Marfan, Turner, Down, Cushing — may guide diagnosis immediately"),
    ("Age vs appearance",      "Does the patient look older than stated age? (Chronic disease, lifestyle, neglect)"),
    ("Hygiene & dress",        "Self-neglect may suggest psychiatric illness, dementia, or social deprivation"),
    ("Assistive devices",      "Wheelchair, walking aids, oxygen, hearing aids, glasses"),
    ("Affect & mood",          "Anxious, depressed, flat, irritable — psychiatric assessment prompt"),
]
story.append(two_col_table(appear_data, header_row=["Observation", "Clinical Significance"]))
story.append(Spacer(1, 0.5*cm))

# ═══ SECTION 4: VITAL SIGNS ══════════════════════════════════════════════════
story.append(section_banner("4. VITAL SIGNS"))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph(
    "The five key vital signs are temperature, pulse, blood pressure, respiratory rate, and oxygen "
    "saturation (pulse oximetry). They are objective, reproducible markers of physiologic stability. "
    "Each should be measured accurately and documented at every clinical encounter.",
    body
))
story.append(Spacer(1, 0.2*cm))

story.append(Paragraph("A. Temperature", h2))
temp_data = [
    ("Normal range",        "36.1 – 37.2 °C (97 – 99 °F) orally; rectally ~0.5°C higher"),
    ("Fever (pyrexia)",     ">38.0 °C — infection (bacterial, viral, fungal), inflammatory, malignancy, drugs"),
    ("Hyperpyrexia",        ">40°C — severe sepsis, heatstroke, malignant hyperthermia, neuroleptic malignant syndrome"),
    ("Hypothermia",         "<35°C — exposure, hypothyroidism, sepsis (especially elderly), alcohol intoxication"),
    ("Methods",             "Oral (most common), rectal (most accurate), tympanic, axillary (least accurate), temporal"),
    ("Fever patterns",      "Continuous (lobar pneumonia), intermittent (malaria), remittent (typhoid), hectic/septic (abscess)"),
]
story.append(two_col_table(temp_data))
story.append(Spacer(1, 0.3*cm))

story.append(Paragraph("B. Pulse", h2))
pulse_data = [
    ("Normal rate",         "60–100 bpm (adults); higher in children, infants"),
    ("Tachycardia",         ">100 bpm — fever, pain, anxiety, anaemia, heart failure, hyperthyroidism, shock"),
    ("Bradycardia",         "<60 bpm — athletes, vagal tone, heart block, hypothyroidism, raised ICP (Cushing reflex), beta-blockers"),
    ("Rhythm",              "Regular or irregular? If irregular — is it regularly irregular (2° heart block) or irregularly irregular (AF)?"),
    ("Volume",              "Full/bounding (fever, AR, PDA, CO₂ retention) vs. weak/thready (shock, dehydration, AS)"),
    ("Character",           "Slow-rising (AS), collapsing (AR, PDA), bisferiens (mixed AS+AR), pulsus alternans (LVF), paradoxus (cardiac tamponade, severe asthma)"),
    ("Rate variability",    "Pulsus paradoxus: >10 mmHg fall in SBP on inspiration — tamponade, severe asthma/COPD"),
    ("Radial-femoral delay","Coarctation of aorta — always check in young hypertensives"),
]
story.append(two_col_table(pulse_data))
story.append(Spacer(1, 0.3*cm))

story.append(Paragraph("C. Blood Pressure", h2))
bp_data = [
    ("Normal",              "Systolic 90–120 mmHg; Diastolic 60–80 mmHg"),
    ("Prehypertension",     "120–139/80–89 mmHg — lifestyle modification advised"),
    ("Stage 1 HTN",         "140–159/90–99 mmHg"),
    ("Stage 2 HTN",         "≥160/≥100 mmHg"),
    ("Hypertensive urgency","≥180/≥120 mmHg without end-organ damage"),
    ("Hypertensive emergency","≥180/≥120 mmHg WITH end-organ damage (brain, heart, kidneys, eyes)"),
    ("Hypotension",         "<90/60 mmHg — septic, cardiogenic, hypovolaemic, neurogenic, anaphylactic shock"),
    ("Measurement",         "Both arms routinely — >10 mmHg difference suggests subclavian stenosis or aortic dissection"),
    ("Postural BP",         "Lying→standing — fall >20 mmHg systolic or >10 mmHg diastolic = orthostatic hypotension"),
    ("Pulse pressure",      "SBP - DBP; widened (>60) in AR, atherosclerosis; narrowed (<25) in AS, tamponade, shock"),
]
story.append(two_col_table(bp_data))
story.append(Spacer(1, 0.3*cm))

story.append(Paragraph("D. Respiratory Rate", h2))
rr_data = [
    ("Normal",      "12–20 breaths/min (adults)"),
    ("Tachypnoea",  ">20 — pneumonia, PE, heart failure, metabolic acidosis, pain, anxiety"),
    ("Bradypnoea",  "<12 — opioid overdose, raised ICP, metabolic alkalosis, hypothyroidism"),
    ("Patterns",    "Cheyne-Stokes (CCF, uraemia, raised ICP), Kussmaul (metabolic acidosis), Biot's (raised ICP)"),
    ("Note",        "RR is the most sensitive early indicator of deterioration — often under-recorded. Count for a full 60 seconds."),
]
story.append(two_col_table(rr_data))
story.append(Spacer(1, 0.3*cm))

story.append(Paragraph("E. Oxygen Saturation (SpO₂)", h2))
spo2_data = [
    ("Normal",          "≥95% on room air (94–98% acceptable range)"),
    ("Mild hypoxia",    "90–94% — supplemental oxygen, investigate cause"),
    ("Moderate hypoxia","85–89% — high-flow oxygen, close monitoring"),
    ("Severe hypoxia",  "<85% — life-threatening, may need respiratory support"),
    ("Limitation",      "Unreliable in carbon monoxide poisoning (CO-oximetry required); inaccurate in poor perfusion, nail polish, dark pigmentation"),
    ("Fifth vital sign","Now considered standard alongside T, P, BP, RR in all clinical settings"),
]
story.append(two_col_table(spo2_data))
story.append(Spacer(1, 0.3*cm))

story.append(info_box(
    "<b>Additional Metrics to Record:</b> Height and weight → BMI (kg/m²). BMI <18.5 = underweight; "
    "18.5–24.9 = normal; 25–29.9 = overweight; ≥30 = obese. Waist circumference (metabolic risk). "
    "In elective settings, always record BMI."
))
story.append(Spacer(1, 0.5*cm))

# ═══ SECTION 5: SYSTEMATIC GENERAL EXAMINATION ═══════════════════════════════
story.append(section_banner("5. SYSTEMATIC GENERAL EXAMINATION — HEAD TO TOE"))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph(
    "The physical examination proceeds systematically from head to toe. This ensures no region "
    "is missed. The four techniques — inspection, palpation, percussion, auscultation (IPPA) — "
    "are applied in order to each region, except the abdomen where auscultation precedes palpation.",
    body
))
story.append(Spacer(1, 0.2*cm))

story.append(Paragraph("Sequence of a Complete Physical Examination", h2))
seq_data = [
    ("1", "General appearance, nutritional status, hydration, mental state"),
    ("2", "Vital signs (T, P, BP, RR, SpO₂, height, weight, BMI)"),
    ("3", "Hands, nails, peripheral circulation, radial pulse"),
    ("4", "Head — scalp, face, eyes (PERLA, fundi), ears, nose, mouth/teeth, throat"),
    ("5", "Neck — thyroid, trachea, carotids, JVP, lymph nodes"),
    ("6", "Chest — respiratory system (inspection, palpation, percussion, auscultation)"),
    ("7", "Cardiovascular — precordium (inspection, palpation, auscultation)"),
    ("8", "Abdomen — inspection, auscultation, palpation (light then deep), percussion"),
    ("9", "Genitalia, hernial orifices, per rectal/vaginal examination if indicated"),
    ("10","Extremities — upper and lower, oedema, peripheral pulses, joints"),
    ("11","Neurological examination — cranial nerves, motor, sensory, reflexes, coordination, gait"),
    ("12","Musculoskeletal — joints, spine, muscles"),
    ("13","Dermatological — skin, hair, nails — systematic survey"),
    ("14","Lymph nodes — all groups"),
]
seq_table_data = [[Paragraph(f"<b>Step {n}</b>", body), Paragraph(desc, body)] for n, desc in seq_data]
seq_tbl = Table(seq_table_data, colWidths=[doc.width * 0.18, doc.width * 0.82])
seq_tbl.setStyle(TableStyle([
    ("ROWBACKGROUNDS", (0, 0), (-1, -1), [LIGHT_BLUE, WHITE]),
    ("BOX",       (0, 0), (-1, -1), 1, MID_BLUE),
    ("INNERGRID", (0, 0), (-1, -1), 0.4, MED_GRAY),
    ("TOPPADDING",    (0, 0), (-1, -1), 4),
    ("BOTTOMPADDING", (0, 0), (-1, -1), 4),
    ("LEFTPADDING",   (0, 0), (-1, -1), 8),
    ("RIGHTPADDING",  (0, 0), (-1, -1), 8),
    ("VALIGN",    (0, 0), (-1, -1), "TOP"),
]))
story.append(seq_tbl)
story.append(Spacer(1, 0.5*cm))

# ═══ SECTION 6: HANDS, NAILS & PERIPHERAL CIRCULATION ═══════════════════════
story.append(section_banner("6. HANDS, NAILS & PERIPHERAL CIRCULATION"))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph(
    "Examination of the hands takes only 30 seconds but yields enormous diagnostic information. "
    "Shaking a patient's hand gives a simultaneous frailty assessment, tissue perfusion estimate, "
    "myotonia screen, and temperature assessment.",
    body
))
story.append(Spacer(1, 0.2*cm))

story.append(Paragraph("Nail Signs", h2))
nail_data = [
    ("Clubbing",            "Grade I–IV. Causes: bronchogenic carcinoma, suppurative lung disease (abscess, bronchiectasis), cyanotic CHD, infective endocarditis, IBD, cirrhosis, mesothelioma"),
    ("Koilonychia",         "Spoon-shaped nails — iron deficiency anaemia (chronic, severe)"),
    ("Leuconychia",         "White nails — hypoalbuminaemia (chronic liver disease, nephrotic syndrome, malnutrition)"),
    ("Terry's nails",       "White proximally, pink distally — liver cirrhosis, CCF, diabetes"),
    ("Splinter haemorrhages","Longitudinal brown-red lines — infective endocarditis (distal splinters are often traumatic)"),
    ("Onycholysis",         "Nail lifting from bed — hyperthyroidism (Plummer's nails), psoriasis, trauma, fungal infection"),
    ("Beau's lines",        "Transverse grooves — periods of severe systemic illness, nutritional deficiency, chemotherapy"),
    ("Mees' lines",         "White transverse bands — arsenic poisoning, renal failure, chemotherapy"),
    ("Cyanosis (peripheral)","Blue discolouration of nails — vasospasm, cold exposure, peripheral vascular disease"),
    ("Pitting",             "Small pits — psoriasis, alopecia areata"),
]
story.append(two_col_table(nail_data, header_row=["Sign", "Causes / Significance"]))
story.append(Spacer(1, 0.3*cm))

story.append(Paragraph("Hand Signs", h2))
hand_data = [
    ("Pallor of palmar creases", "Haemoglobin <7–8 g/dL — significant anaemia"),
    ("Palmar erythema",         "Chronic liver disease, pregnancy, RA, hyperthyroidism, idiopathic"),
    ("Dupuytren's contracture", "Fibrosis of palmar fascia — liver cirrhosis (alcohol), diabetes, trauma, genetic"),
    ("Tremor",                  "Resting (Parkinson's), intention (cerebellar), postural (essential tremor, thyrotoxicosis)"),
    ("Wasting of thenar eminence","Carpal tunnel syndrome (median nerve), T1 root lesion"),
    ("Wasting of hypothenar",   "Ulnar nerve palsy, C8/T1 root lesion, syringomyelia"),
    ("Heberden's nodes",        "DIP joint osteophytes — primary osteoarthritis"),
    ("Bouchard's nodes",        "PIP joint osteophytes — osteoarthritis"),
    ("Osler's nodes",           "Painful nodules on fingertips — infective endocarditis (immune complex)"),
    ("Janeway lesions",         "Non-tender haemorrhagic macules on palms/soles — infective endocarditis (septic emboli)"),
    ("Xanthomata",              "Cholesterol deposits — hypercholesterolaemia, familial hyperlipidaemia"),
]
story.append(two_col_table(hand_data))
story.append(Spacer(1, 0.5*cm))

# ═══ SECTION 7: HEAD & NECK ══════════════════════════════════════════════════
story.append(section_banner("7. HEAD & NECK EXAMINATION"))
story.append(Spacer(1, 0.3*cm))

story.append(Paragraph("Eyes", h2))
eye_data = [
    ("Conjunctival pallor",    "Anaemia — pull down lower lid; pale pink/white mucosa"),
    ("Scleral icterus",        "Jaundice — bilirubin >35 µmol/L; best seen in natural light"),
    ("Corneal arcus",          "Lipid ring — hyperlipidaemia in <45 years; normal in elderly"),
    ("Xanthelasmata",          "Yellow plaques at inner canthi — hyperlipidaemia"),
    ("Proptosis/exophthalmos", "Hyperthyroidism (Graves'), retro-orbital tumour"),
    ("Ptosis",                 "CN III palsy (with dilated pupil), Horner's (with miosis), myasthenia gravis (fatigable)"),
    ("Kayser-Fleischer rings", "Copper deposits in Descemet's membrane — Wilson's disease"),
    ("Pupils",                 "PERLA (pupils equal, round, reactive to light and accommodation). Anisocoria, fixed dilated, pinpoint"),
    ("Fundoscopy",             "Papilloedema (raised ICP), hypertensive retinopathy (AV nipping, haemorrhages), diabetic retinopathy"),
]
story.append(two_col_table(eye_data))
story.append(Spacer(1, 0.3*cm))

story.append(Paragraph("Face & Mouth", h2))
face_data = [
    ("Moon face",           "Cushing's syndrome — round plethoric face, acne, hirsutism"),
    ("Malar flush",         "Mitral stenosis — bilateral reddish-cyanotic cheeks"),
    ("Butterfly rash",      "SLE — erythematous rash across cheeks and nose bridge, sparing nasolabial folds"),
    ("Acromegalic facies",  "Protruding jaw, large nose, coarse features, widely spaced teeth — GH excess"),
    ("Myxoedematous facies","Periorbital puffiness, thick dry skin, hoarse voice, sparse lateral eyebrows — hypothyroidism"),
    ("Central cyanosis",    "Bluish discolouration of lips and tongue — cardiorespiratory failure, Hb <5 g/dL of deoxygenated blood"),
    ("Angular cheilosis",   "Iron deficiency, B₂ deficiency, ill-fitting dentures"),
    ("Mouth/teeth",         "Dental caries/infection — source of bacteraemia; gum disease; oral candidiasis (immunosuppression)"),
]
story.append(two_col_table(face_data))
story.append(Spacer(1, 0.3*cm))

story.append(Paragraph("Neck", h2))
neck_data = [
    ("JVP",                 "Jugular venous pressure — internal jugular at 45°. Normal <3 cm above sternal angle. Elevated in CCF, SVCO, pericardial disease, TR"),
    ("Tracheal position",   "Central vs. deviated — trachea deviates away from tension pneumothorax, towards collapse/fibrosis"),
    ("Thyroid",             "Size, consistency, nodularity, tenderness, bruit, lymphadenopathy, dysphagia, tracheal compression"),
    ("Carotid pulse",       "Rate, character, bruits (→ carotid artery disease)"),
    ("Cervical LN",         "Anterior/posterior triangle; supraclavicular (Virchow's node — left = GI malignancy, right = lung/mediastinal)"),
]
story.append(two_col_table(neck_data))
story.append(Spacer(1, 0.5*cm))

# ═══ SECTION 8: CHEST & CARDIOVASCULAR ═══════════════════════════════════════
story.append(section_banner("8. CHEST & CARDIOVASCULAR EXAMINATION OVERVIEW"))
story.append(Spacer(1, 0.3*cm))

story.append(Paragraph("Stepwise Cardiovascular Examination (Fuster & Hurst's The Heart)", h2))
cardio_data = [
    ("Sitting — Step 1",  "General inspection including dental examination (source of endocarditis)"),
    ("Sitting — Step 2",  "Shake hands → palpate radial pulse; inspect nail beds (clubbing, cyanosis, splinters)"),
    ("Sitting — Step 3",  "Manual blood pressure both arms (>10 mmHg difference is significant)"),
    ("Sitting — Step 4",  "Inspect chest and lower extremities — skin, scars, deformity"),
    ("Sitting — Step 5",  "Palpation + auscultation of carotids — upstroke character, bruits"),
    ("Sitting — Step 6",  "Palpation of chest — PMI, heaves, thrills"),
    ("Sitting — Step 7",  "Lung examination — percussion + auscultation (crackles in CCF/pneumonia, wheeze in COPD/asthma)"),
    ("Sitting — Step 8",  "Auscultation of precordium with diaphragm: upper sternal border → right upper sternal → down to apex"),
    ("Sitting→Supine",    "Estimate central venous pressure via JVP; may need to lower head of bed"),
    ("Supine — Step 10",  "Inspect precordium — apex beat position, visible heave"),
    ("Supine — Step 11",  "Palpate apical impulse + right ventricular heave"),
    ("Supine — Step 12",  "Auscultate with diaphragm: apex → sternal border → left upper border → right upper sternal"),
    ("Left lateral decubitus","Palpate and auscultate apex with bell — mitral stenosis rumble best heard here"),
    ("Remaining exam",    "Liver size (hepatomegaly in CCF), ascites, ankle/sacral oedema, vascular exam of legs"),
]
story.append(two_col_table(cardio_data, header_row=["Position / Step", "Examination Element"]))
story.append(Spacer(1, 0.3*cm))

story.append(Paragraph("Respiratory Examination Highlights", h2))
resp_data = [
    ("Inspection",   "Respiratory rate, pattern, depth; use of accessory muscles; chest shape (barrel = hyperinflation), asymmetry, scars; tracheal position; pursed-lip breathing"),
    ("Palpation",    "Chest expansion (normal = symmetric, ≥5 cm); tactile vocal fremitus (increased = consolidation; decreased = effusion/pneumothorax)"),
    ("Percussion",   "Resonant (normal), dull (consolidation, effusion, collapse), hyper-resonant (pneumothorax, emphysema)"),
    ("Auscultation", "Breath sounds: vesicular (normal), bronchial (consolidation, above effusion). Added sounds: crackles (fine=fibrosis/LVF, coarse=secretions), wheeze (airway narrowing), pleural rub"),
]
story.append(two_col_table(resp_data))
story.append(Spacer(1, 0.5*cm))

# ═══ SECTION 9: ABDOMINAL EXAMINATION ════════════════════════════════════════
story.append(section_banner("9. ABDOMINAL EXAMINATION OVERVIEW"))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph(
    "The patient should be lying flat with hips and knees extended (pillow if needed) with the "
    "abdomen adequately exposed from xiphisternum to inguinal ligaments. For palpation, flex "
    "hips and knees to relax abdominal muscles. (Bailey & Love's Surgery, 28th Ed.)",
    body
))
story.append(Spacer(1, 0.2*cm))

abd_data = [
    ("Inspection",
     "Weight loss, dehydration, pedal oedema, anaemia, jaundice, abnormal pigmentation. "
     "Scars, distension, visible peristalsis, dilated veins (caput medusae in portal HTN), "
     "pulsatile mass, visible hernias. "
     "Grey Turner's sign = flank bruising (retroperitoneal haemorrhage — pancreatitis, AAA). "
     "Cullen's sign = periumbilical bruising (pancreatitis, ruptured ectopic, liver trauma)."),
    ("Auscultation",
     "Before palpation. Normal bowel sounds q5–15 seconds. "
     "Absent = paralytic ileus, peritonitis. "
     "Tinkling/high-pitched = mechanical obstruction. "
     "Arterial bruits = renal artery stenosis (renal bruits), AAA."),
    ("Palpation — Light",
     "Superficial palpation with warm hands, watching the face. "
     "Tenderness, guarding (voluntary/involuntary), rebound tenderness (peritonism). "
     "Start away from the area of pain."),
    ("Palpation — Deep",
     "Organomegaly: liver (measure in cm below costal margin), spleen (Traube's space, left lateral decubitus), kidneys (bimanual ballottement). "
     "Identify masses: location, size, shape, consistency, surface, mobility, pulsatility, transillumination."),
    ("Percussion",
     "Liver span (6–12 cm). "
     "Splenomegaly (dull in Traube's space). "
     "Shifting dullness + fluid thrill = ascites (≥1.5L for shifting dullness). "
     "Suprapubic dullness = bladder distension."),
    ("Hernial orifices",
     "Inguinal (medial = direct, lateral = indirect), femoral (below and lateral to pubic tubercle), umbilical, incisional scars. "
     "Ask patient to cough; check for reducibility, auscultate if suspected bowel."),
    ("PR examination",
     "Rectal mass, haemorrhoids, prostate size/consistency, cervix, peritoneal deposits ('shelf'). "
     "Observe stool on glove: blood, mucus, melaena."),
]
story.append(two_col_table(abd_data, header_row=["Technique", "Key Findings"]))
story.append(Spacer(1, 0.5*cm))

# ═══ SECTION 10: NEUROLOGICAL GENERAL EXAMINATION ═══════════════════════════
story.append(section_banner("10. NEUROLOGICAL GENERAL EXAMINATION"))
story.append(Spacer(1, 0.3*cm))

story.append(Paragraph(
    "The neurological examination proceeds systematically. Localization is the cornerstone — "
    "identifying where in the nervous system the lesion is, before considering what it is. "
    "(Neuroanatomy Through Clinical Cases, 3rd Ed.)",
    body
))
story.append(Spacer(1, 0.2*cm))

neuro_data = [
    ("Mental State",        "Consciousness (GCS/AVPU), orientation (time, place, person), memory (short/long term), language, affect, higher functions — MMSE/MoCA if indicated"),
    ("Cranial Nerves I–XII","CN I: smell. CN II: acuity, fields, fundi, RAPD. CN III/IV/VI: eye movements, pupils. CN V: facial sensation + jaw. CN VII: facial muscles. CN VIII: hearing, Rinne/Weber. CN IX/X: palate, gag. CN XI: trapezius/SCM. CN XII: tongue (wasting, fasciculations, deviation)"),
    ("Motor System",        "Tone (normal/spastic/rigid/flaccid), power (MRC 0–5 scale), bulk (wasting, hypertrophy), involuntary movements (tremor, fasciculations, chorea, athetosis)"),
    ("Reflexes",            "DTRs: biceps C5, triceps C7, supinator C6, knee L3-4, ankle S1. Plantar response (upgoing=UMN). Reinforcement (Jendrassik). Clonus. Primitive reflexes (frontal lobe)"),
    ("Sensation",           "Light touch, pinprick, temperature, vibration (128 Hz tuning fork), proprioception (joint position sense), two-point discrimination, stereognosis, graphaesthesia"),
    ("Coordination",        "Finger-nose test (dysmetria, intention tremor), heel-shin, rapid alternating movements (dysdiadochokinesis), Romberg's test"),
    ("Gait",                "Observe: stride, base, arm swing, turning. Hemiplegic, spastic (scissors), steppage (foot drop), ataxic (broad-based), parkinsonian (shuffling, festinant, reduced arm swing), apraxic (dementia)"),
    ("Signs of meningism",  "Neck stiffness, Kernig's sign (knee extension from 90° flexion), Brudzinski's sign — bacterial meningitis, SAH, meningeal carcinomatosis"),
]
story.append(two_col_table(neuro_data, header_row=["Component", "Assessment"]))
story.append(Spacer(1, 0.5*cm))

# ═══ SECTION 11: LYMPH NODES, SKIN, MSK ══════════════════════════════════════
story.append(section_banner("11. LYMPH NODES, SKIN & MUSCULOSKELETAL ASSESSMENT"))
story.append(Spacer(1, 0.3*cm))

story.append(Paragraph("Lymph Node Examination", h2))
ln_data = [
    ("Cervical groups",   "Submental, submandibular, anterior/posterior cervical chains, preauricular, postauricular, occipital, supraclavicular"),
    ("Axillary groups",   "Anterior (pectoral), posterior (subscapular), lateral, medial (brachial), apical — examine with arm supported"),
    ("Inguinal groups",   "Horizontal (superficial inguinal), vertical"),
    ("Other groups",      "Epitrochlear (forearm/hand infections, secondary syphilis), popliteal (rare)"),
    ("Palpation features","Size, shape, consistency (hard=malignant; rubbery=lymphoma; soft=reactive), surface, tenderness, fixation, matting, overlying skin"),
    ("Virchow's node",    "Left supraclavicular lymphadenopathy — Troisier's sign — GI malignancy (especially gastric). Right supraclavicular — lung, mediastinum"),
    ("Causes of generalised LN", "Infections (EBV, HIV, TB, brucella), haematological malignancy (CLL, lymphoma), SLE, sarcoidosis, drugs"),
]
story.append(two_col_table(ln_data, header_row=["Region/Feature", "Details"]))
story.append(Spacer(1, 0.3*cm))

story.append(Paragraph("Key Dermatological Signs in General Examination", h2))
derm_data = [
    ("Jaundice",            "Skin + sclera yellow → pre-hepatic (haemolysis), hepatic (liver disease), post-hepatic (biliary obstruction)"),
    ("Pallor",              "Anaemia, shock, vasoconstriction — assess conjunctivae, palms, mucous membranes"),
    ("Central cyanosis",    "Lips, tongue, buccal mucosa — right-to-left shunts, severe respiratory failure"),
    ("Peripheral cyanosis", "Fingers, toes, nose, ears — vasoconstriction, Raynaud's, peripheral vascular disease"),
    ("Spider naevi",        ">5 in distribution of SVC (face, neck, upper arms, trunk) — chronic liver disease; also seen in pregnancy"),
    ("Purpura/petechiae",   "Non-blanching — thrombocytopaenia, meningococcaemia, vasculitis, DIC, Henoch-Schönlein purpura"),
    ("Oedema",              "Pedal/ankle oedema: CCF, hypoalbuminaemia (nephrotic/hepatic), venous insufficiency, lymphoedema, drug-induced. Sacral oedema in bed-bound patients"),
    ("Rashes",              "Distribution, character (macular, papular, vesicular, pustular, plaques), blanching — document carefully"),
    ("Hyperpigmentation",   "Addison's disease (buccal mucosa, pressure areas, scars), haemochromatosis (bronzing), primary biliary cholangitis"),
    ("Striae",              "Silver (old) or purple/red (active — Cushing's/rapid weight change)"),
]
story.append(two_col_table(derm_data))
story.append(Spacer(1, 0.5*cm))

# ═══ SECTION 12: ASSESSMENT, DIFFERENTIAL & PLAN ═════════════════════════════
story.append(section_banner("12. ASSESSMENT, DIFFERENTIAL DIAGNOSIS & PLAN"))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph(
    "After completing the history and examination, the clinician synthesises all findings into "
    "a structured Assessment and Plan. This is the clinical reasoning step — moving from data "
    "collection to diagnosis and management.",
    body
))
story.append(Spacer(1, 0.2*cm))

story.append(Paragraph("Structure of Assessment", h2))
story.append(Paragraph(
    "<b>Step 1 — Summary formulation:</b> A 1–2 sentence summary encapsulating the patient's key clinical "
    "features and most likely diagnosis.",
    body
))
story.append(Paragraph(
    "<i>Example: \"This is a 53-year-old man with cardiac risk factors of hypertension and family "
    "history of coronary artery disease who presents with substernal chest pain and EKG changes "
    "suggestive of anterolateral wall myocardial infarction.\"</i>",
    note_style
))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph(
    "<b>Step 2 — Differential diagnosis:</b> List alternative diagnoses in order of likelihood. "
    "Use the mnemonic VINDICATE or a systems-based approach.",
    body
))
story.append(Paragraph(
    "<b>Step 3 — Problem list:</b> Break down all active problems.",
    body
))
story.append(Paragraph(
    "<b>Step 4 — Management plan:</b> For each problem, outline investigations, treatments, "
    "monitoring, referrals, and patient education.",
    body
))
story.append(Spacer(1, 0.3*cm))

story.append(Paragraph("Neurological Differential Diagnosis — Arrowhead Approach", h2))
story.append(Paragraph(
    "In neurology, the assessment is first anatomical (localization), then aetiological. "
    "Use the mnemonic <b>VITAMIN C(D)</b> for the neurological differential:",
    body
))
vitamin_data = [
    ("V — Vascular",        "Stroke, TIA, haemorrhage, vasculitis, venous thrombosis"),
    ("I — Infectious",      "Meningitis, encephalitis, abscess, HIV, PML, neurosyphilis"),
    ("T — Traumatic/Toxic", "Head injury, spinal cord injury, metabolic encephalopathy, drugs/alcohol"),
    ("A — Autoimmune",      "MS, NMO, anti-NMDAR encephalitis, Guillain-Barré, myasthenia gravis, vasculitis"),
    ("M — Metabolic",       "Hepatic/renal encephalopathy, hypoglycaemia, electrolyte disorders, thiamine deficiency"),
    ("I — Idiopathic",      "Epilepsy, Parkinson's disease, essential tremor"),
    ("N — Neoplastic",      "Primary brain tumour, metastases, paraneoplastic syndromes, meningeal carcinomatosis"),
    ("C — Congenital",      "Malformations, neurocutaneous syndromes (NF1/2, TSC, Sturge-Weber)"),
    ("D — Degenerative",    "Alzheimer's, frontotemporal dementia, motor neurone disease, Huntington's, MSA"),
]
story.append(two_col_table(vitamin_data, header_row=["Category", "Examples"]))
story.append(Spacer(1, 0.5*cm))

# ═══ SECTION 13: SPECIAL POPULATIONS & CLINICAL PEARLS ═══════════════════════
story.append(section_banner("13. SPECIAL POPULATIONS & KEY CLINICAL PEARLS"))
story.append(Spacer(1, 0.3*cm))

story.append(Paragraph("Special Populations", h2))
pop_data = [
    ("Paediatric",      "Adjust normal ranges for age (HR, BP, RR). Use PEWS score for deterioration. Assess growth parameters, developmental milestones, immunisation status, safeguarding concerns"),
    ("Geriatric",       "Polypharmacy (>5 medications — increased interaction risk). Atypical presentations of common diseases. Falls, cognitive decline, functional status (ADLs/IADLs), nutritional screening, pressure sores, urinary incontinence"),
    ("Pregnant",        "Physiological changes: HR+10–15 bpm, BP drops in 2nd trimester, RR may increase. Avoid supine position in late pregnancy (aortocaval compression). Fundal height, foetal heart sounds, presentation, engagement"),
    ("Immunocompromised","Atypical/absent fever, minimal examination signs despite severe infection. Low threshold for investigation. Screen for opportunistic infections (PCP, CMV, fungal)"),
    ("Renal/hepatic impairment", "Drug dosing adjustments mandatory. Monitor for encephalopathy (hepatic), uraemia (renal). Fluid balance critically important"),
    ("Psychiatric/alcohol/drug","Non-judgmental approach. Cognitive assessment. Withdrawal risk scoring (CIWA for alcohol). Nutritional status, infectious disease screening (HIV, Hep B/C), safeguarding"),
]
story.append(two_col_table(pop_data, header_row=["Population", "Special Considerations"]))
story.append(Spacer(1, 0.3*cm))

story.append(Paragraph("Key Clinical Pearls", h2))
pearls = [
    "The history gives the diagnosis in 70–80% of cases. Time invested in history is never wasted.",
    "Vital signs are the most sensitive early indicators of deterioration — respiratory rate especially. Always count the RR for a full 60 seconds.",
    "Never examine through clothing. Proper exposure is non-negotiable for a thorough examination.",
    "Always examine the other limb, the contralateral lymph nodes, and adjacent structures before diagnosing a localised lesion.",
    "In any patient with a swelling suspected to be malignant, metastatic sites must be systematically assessed — chest (cough, haemoptysis), liver, abdomen (peritoneal), bones (spine, pelvis, skull). (S. Das, Manual on Clinical Surgery)",
    "Lymph node enlargement always requires examination of all lymph node groups to identify the cause.",
    "Grey Turner's sign and Cullen's sign indicate retroperitoneal/intra-abdominal haemorrhage — early recognition can be life-saving.",
    "A 'positive shaking hands' examination gives frailty assessment, tone, temperature, pulse, and bilateral BP asymmetry simultaneously.",
    "Virchow's node (left supraclavicular lymphadenopathy) is a red flag for intra-abdominal or thoracic malignancy — never ignore it.",
    "Document all findings clearly: positive AND pertinent negative findings both contribute to the clinical picture and medicolegal record.",
    "In elderly patients, always assess functional status alongside clinical examination — a patient's ability to perform ADLs often predicts outcome better than lab values.",
    "Pain is sometimes considered the 'sixth vital sign' — always assess and document it."
]
for pearl in pearls:
    story.append(Paragraph(f"★  {pearl}", bullet_style))
    story.append(Spacer(1, 0.1*cm))

story.append(Spacer(1, 0.4*cm))
story.append(hr())

# ─── References ───────────────────────────────────────────────────────────────
story.append(Paragraph("References & Sources", h2))
refs = [
    "Goldman L, Cooney KA (eds). Goldman-Cecil Medicine International Edition, 2-Volume Set. 26th ed. Elsevier, 2023.",
    "Fuster V, Harrington RA, Narula J, Eapen ZJ (eds). Fuster and Hurst's The Heart. 15th ed. McGraw-Hill, 2022.",
    "Williams NS, O'Connell PR, McCaskie AW (eds). Bailey and Love's Short Practice of Surgery. 28th ed. CRC Press/Taylor & Francis, 2023.",
    "Das S. A Manual on Clinical Surgery. 13th ed. Dr S Das, 2020.",
    "Blumenfeld H. Neuroanatomy Through Clinical Cases. 3rd ed. Sinauer/Oxford University Press, 2021.",
    "Bradley WG, Daroff RB et al. Bradley and Daroff's Neurology in Clinical Practice. 8th ed. Elsevier, 2022.",
]
for ref in refs:
    story.append(Paragraph(f"• {ref}", note_style))

story.append(Spacer(1, 0.5*cm))

# ─── Footer note ──────────────────────────────────────────────────────────────
footer_box_data = [[Paragraph(
    "<b>Disclaimer:</b> This document is compiled from authoritative medical textbooks for "
    "educational purposes only. It does not constitute clinical advice. Clinical decisions must "
    "be made by qualified healthcare professionals taking into account the individual patient's "
    "full clinical context.",
    ParagraphStyle("FooterNote", fontSize=8, leading=12, textColor=colors.HexColor("#555555"),
                   fontName="Helvetica-Oblique", alignment=TA_LEFT)
)]]
footer_tbl = Table(footer_box_data, colWidths=[doc.width])
footer_tbl.setStyle(TableStyle([
    ("BACKGROUND",    (0, 0), (-1, -1), LIGHT_GRAY),
    ("BOX",           (0, 0), (-1, -1), 0.8, MED_GRAY),
    ("TOPPADDING",    (0, 0), (-1, -1), 8),
    ("BOTTOMPADDING", (0, 0), (-1, -1), 8),
    ("LEFTPADDING",   (0, 0), (-1, -1), 10),
    ("RIGHTPADDING",  (0, 0), (-1, -1), 10),
]))
story.append(footer_tbl)

# ─── Build ─────────────────────────────────────────────────────────────────────
doc.build(story)
print(f"PDF successfully created: {OUTPUT_PATH}")
Running Command

cd /tmp/workspace/patient-examination && python generate_pdf.py

Running Command

ls -lh /tmp/workspace/patient-examination/Approach_to_Patient_General_Examination.pdf

Your PDF is ready for download:

Approach to Patient General Examination

PDF Document · PDF


Here is a summary of what the PDF contains (48 KB, professionally formatted with colour-coded section banners, tables, and info boxes):
Cover Page with table of contents
13 Comprehensive Sections:
  1. Approach to the Patient - Principles - The five pillars of patient assessment; principles from Fuster & Hurst's The Heart
  2. History Taking - Full SOCRATES framework for HPI; PMH/PSH; medications & allergies; family history; social/personal history (smoking, alcohol, occupation, travel, sexual history)
  3. General Appearance & First Impression - End-of-bed observations with clinical significance for each sign
  4. Vital Signs - Detailed tables for temperature (fever patterns), pulse (character types, pulsus paradoxus), blood pressure (all stages, postural BP, pulse pressure), respiratory rate (Cheyne-Stokes/Kussmaul/Biot's patterns), SpO₂ (with limitations)
  5. Systematic General Examination - 14-step head-to-toe sequence
  6. Hands, Nails & Peripheral Circulation - Nail signs (clubbing, koilonychia, splinter haemorrhages, Beau's/Mees' lines) and hand signs (Osler's nodes, Janeway lesions, Dupuytren's, palmar erythema)
  7. Head & Neck - Eyes (PERLA, Kayser-Fleischer, fundoscopy), face (moon face, malar flush, butterfly rash, acromegaly), neck (JVP, thyroid, Virchow's node)
  8. Chest & Cardiovascular - Full stepwise Fuster & Hurst 14-position cardiac exam; respiratory IPPA
  9. Abdominal Examination - Grey Turner's/Cullen's signs, all IPPA techniques with key findings
  10. Neurological Examination - Cranial nerves, motor, reflexes, sensation, coordination, gait, meningism
  11. Lymph Nodes, Skin & MSK - All lymph node groups; full dermatological signs (jaundice, cyanosis, spider naevi, purpura, oedema)
  12. Assessment, Differential & Plan - VITAMIN C(D) mnemonic for neurological DDx
  13. Special Populations & Clinical Pearls - Paediatric, geriatric, pregnant, immunocompromised; 12 key clinical pearls
Sources: Goldman-Cecil Medicine, Fuster & Hurst's The Heart (15th Ed.), Bailey & Love's Surgery (28th Ed.), S. Das Manual on Clinical Surgery (13th Ed.), Neuroanatomy Through Clinical Cases (3rd Ed.)

Make a visual infographic poster of the IPPA examination techniques

Generating Image

A detailed medical education infographic poster titled "IPPA Examination Techniques" showing all four physical examination methods. The poster is divided into four bold color-coded sections arranged in a 2x2 grid layout: TOP LEFT - INSPECTION (deep blue background): Icon of an eye. Key points listed: General appearance, skin color, body shape, posture, movements, swellings, scars, rashes, deformities, breathing pattern, visible pulsations. Sub-note: "Always inspect before touching." TOP RIGHT - PALPATION (teal/green background): Icon of a hand touching. Key points: Light palpation (superficial tenderness, guarding), Deep palpation (organomegaly, masses), Texture, temperature, consistency, tenderness, fluctuation, pulsatility, crepitus, fremitus. Sub-note: "Warm hands. Watch the patient's face." BOTTOM LEFT - PERCUSSION (orange/amber background): Icon of fingers tapping. Percussion notes listed in a small legend: Resonant (normal lung), Dull (consolidation/effusion/mass), Hyper-resonant (pneumothorax/emphysema), Stony dull (pleural effusion), Tympanic (gas-filled bowel). Technique tip: Middle finger of non-dominant hand flat on skin, tap with dominant middle finger. Sub-note: "Elicits sound and vibration through tissues." BOTTOM RIGHT - AUSCULTATION (purple/violet background): Icon of a stethoscope. Key points: Use diaphragm for high-pitched sounds (breath sounds, normal heart sounds, bowel sounds), Use bell for low-pitched sounds (mitral stenosis murmur, S3/S4 gallop). Added sounds: Crackles (fine=fibrosis, coarse=secretions), Wheeze (airway narrowing), Pleural rub, Bruit (turbulent flow). Sub-note: "Silence the room. Listen systematically." CENTER of poster: Bold title "IPPA — The Four Pillars of Physical Examination" with a circular diagram showing the order I → P → P → A with arrows (note: abdomen uses I → A → P → P order). Bottom strip: "Exception: In abdominal examination, AUSCULTATION precedes palpation and percussion to avoid stimulating bowel sounds artificially." Clean professional medical infographic style, white text on colored backgrounds, clear icons, well-spaced readable typography, suitable for clinical teaching.

IPPA Examination Techniques Infographic
Here's your IPPA infographic poster! It covers all four examination pillars:
  • Inspection (Blue) - Visual assessment before any contact: appearance, skin, posture, scars, breathing pattern
  • Palpation (Teal) - Light (tenderness, guarding) and deep (organomegaly, masses); technique tips on warm hands and watching the patient's face
  • Percussion (Amber) - Five percussion note types (resonant, dull, hyper-resonant, stony dull, tympanic) with technique guidance
  • Auscultation (Purple) - Diaphragm vs bell usage; added sounds (crackles, wheeze, bruits, pleural rub)
  • Centre - The I→P→P→A flow diagram with the critical abdominal exception (I→A→P→P) highlighted at the bottom

give me detailed PPT with real reference images, diagrams, flowcharts and tables on topic 'Systemic Examination of Patient'

Reading File
Now let me run parallel searches - medical library content + reference images simultaneously:
Finding Sources
Finding Sources
Searching Images

clubbing fingers respiratory examination

This clinical photograph shows a close-up of a patient's fingers demonstrating classic signs of digital clubbing and peripheral cyanosis. The distal phalanges exhibit a bulbous, 'drumstick' appearance with a noticeable loss of the normal Lovibond angle (the angle between the nail plate and the proximal nail fold). The nail beds appear convex and rounded. A distinct bluish-purple discoloration (cyanosis) is visible across the nail beds and distal fingertips, indicating poor blood oxygenation or circulation. A black arrow points to the most prominent area of clubbing on the index finger. These findings are clinically significant as they often indicate chronic hypoxemia secondary to congenital heart disease (such as Ebstein anomaly), pulmonary disease, or chronic inflammatory conditions. This image serves as a teaching tool for physical examination findings in cardiovascular and respiratory medicine.

This clinical photograph shows a close-up of a patient's fingers demonstrating classic signs of digital clubbing and peripheral cyanosis. The distal phalanges exhibit a bulbous, 'drumstick' appearance with a noticeable loss of the normal Lovibond angle (the angle between the nail plate and the proximal nail fold). The nail beds appear convex and rounded. A distinct bluish-purple discoloration (cyanosis) is visible across the nail beds and distal fingertips, indicating poor blood oxygenation or circulation. A black arrow points to the most prominent area of clubbing on the index finger. These findings are clinically significant as they often indicate chronic hypoxemia secondary to congenital heart disease (such as Ebstein anomaly), pulmonary disease, or chronic inflammatory conditions. This image serves as a teaching tool for physical examination findings in cardiovascular and respiratory medicine.

This clinical photograph displays a dorsal view of a human hand illustrating digital clubbing (Hippocratic fingers). The distal phalanges of the fingers show bulbous enlargement and soft tissue swelling, most prominently at the index and middle fingers. The nail beds exhibit significant longitudinal and transverse hypercurvature, giving the nails a 'watch-glass' appearance. There is a visible loss of the Lovibond angle (the normal angle between the nail plate and the proximal nail fold). An arrow indicates the distal phalanx of the fourth digit to emphasize these structural changes. The skin of the hand demonstrates a diffuse erythematous or dusky hue, clinically consistent with secondary polycythemia or chronic cyanosis. This visual finding is a classic diagnostic sign often associated with chronic hypoxemia, cyanotic congenital heart disease (such as Eisenmenger syndrome), or chronic pulmonary disease. The image serves as an educational reference for physical examination findings in cardiovascular and respiratory medicine.

This clinical photograph displays a dorsal view of a human hand illustrating digital clubbing (Hippocratic fingers). The distal phalanges of the fingers show bulbous enlargement and soft tissue swelling, most prominently at the index and middle fingers. The nail beds exhibit significant longitudinal and transverse hypercurvature, giving the nails a 'watch-glass' appearance. There is a visible loss of the Lovibond angle (the normal angle between the nail plate and the proximal nail fold). An arrow indicates the distal phalanx of the fourth digit to emphasize these structural changes. The skin of the hand demonstrates a diffuse erythematous or dusky hue, clinically consistent with secondary polycythemia or chronic cyanosis. This visual finding is a classic diagnostic sign often associated with chronic hypoxemia, cyanotic congenital heart disease (such as Eisenmenger syndrome), or chronic pulmonary disease. The image serves as an educational reference for physical examination findings in cardiovascular and respiratory medicine.

A clinical photograph displaying the dorsal view of both hands, demonstrating bilateral and symmetrical digital clubbing. The terminal phalanges of all digits show characteristic bulbous, drumstick-like swelling of the soft tissues. There is a visible loss of the normal Lovibond angle (the angle between the nail plate and the proximal nail fold), and the nails exhibit increased longitudinal curvature. The skin of the distal fingers appears mildly erythematous with a subtle dusky or cyanotic hue, consistent with chronic hypoxemia. This presentation is a classic clinical sign of underlying systemic conditions, such as cyanotic congenital heart disease (e.g., ventricular septal defect with Eisenmenger syndrome) or chronic pulmonary pathology. The image serves as an educational example for physical examination findings in cardiovascular and respiratory medicine, highlighting the morphology of hippocratic fingers.

A clinical photograph displaying the dorsal view of both hands, demonstrating bilateral and symmetrical digital clubbing. The terminal phalanges of all digits show characteristic bulbous, drumstick-like swelling of the soft tissues. There is a visible loss of the normal Lovibond angle (the angle between the nail plate and the proximal nail fold), and the nails exhibit increased longitudinal curvature. The skin of the distal fingers appears mildly erythematous with a subtle dusky or cyanotic hue, consistent with chronic hypoxemia. This presentation is a classic clinical sign of underlying systemic conditions, such as cyanotic congenital heart disease (e.g., ventricular septal defect with Eisenmenger syndrome) or chronic pulmonary pathology. The image serves as an educational example for physical examination findings in cardiovascular and respiratory medicine, highlighting the morphology of hippocratic fingers.

Clinical photograph of the dorsal aspect of both hands in a patient, demonstrating digital clubbing (Hippocratic fingers). Red arrows highlight the bulbous, drumstick-like enlargement of the distal phalanges. The nailbeds exhibit increased convexity and a rounded, 'watch-glass' appearance, indicating a loss of the normal Schamroth window angle. The skin on the hands appears thin with visible dorsal venous patterns and a small scar on the left hand. This finding is a clinical sign often associated with chronic hypoxemia, underlying pulmonary malignancy (such as the lung mass noted in the clinical context), or hypertrophic osteoarthropathy (HOA). The photograph serves as an educational tool for identifying physical manifestations of systemic disease during a rheumatological or respiratory examination.

Clinical photograph of the dorsal aspect of both hands in a patient, demonstrating digital clubbing (Hippocratic fingers). Red arrows highlight the bulbous, drumstick-like enlargement of the distal phalanges. The nailbeds exhibit increased convexity and a rounded, 'watch-glass' appearance, indicating a loss of the normal Schamroth window angle. The skin on the hands appears thin with visible dorsal venous patterns and a small scar on the left hand. This finding is a clinical sign often associated with chronic hypoxemia, underlying pulmonary malignancy (such as the lung mass noted in the clinical context), or hypertrophic osteoarthropathy (HOA). The photograph serves as an educational tool for identifying physical manifestations of systemic disease during a rheumatological or respiratory examination.

Searching Images

chest percussion auscultation respiratory examination

This clinical photograph captures a healthcare professional performing a respiratory physical examination on a patient in a ward setting. The physician, wearing a white clinical coat and patterned shirt, is seen leaning forward in a focused posture. He is using an acoustic stethoscope to perform auscultation of the patient's posterior chest (back). The patient is seated on a hospital bed, facing away from the camera, with a white cloth draped around their shoulders to expose the thoracic region for examination. The image illustrates standard clinical practice for evaluating pulmonary health, particularly relevant in the context of screening for opportunistic infections like tuberculosis in HIV-positive populations within resource-limited settings. The setting appears to be an inpatient or outpatient department specialized in infectious disease management.

This clinical photograph captures a healthcare professional performing a respiratory physical examination on a patient in a ward setting. The physician, wearing a white clinical coat and patterned shirt, is seen leaning forward in a focused posture. He is using an acoustic stethoscope to perform auscultation of the patient's posterior chest (back). The patient is seated on a hospital bed, facing away from the camera, with a white cloth draped around their shoulders to expose the thoracic region for examination. The image illustrates standard clinical practice for evaluating pulmonary health, particularly relevant in the context of screening for opportunistic infections like tuberculosis in HIV-positive populations within resource-limited settings. The setting appears to be an inpatient or outpatient department specialized in infectious disease management.

A clinical photograph captured as a video frame depicting a clinician performing a physical examination on a male patient. The clinician is leaning over the patient and using a stethoscope to perform auscultation of the chest. The patient is lying in a supine position on a clinical examination table with the upper body exposed, facilitating access to thoracic landmarks. The clinician is shown positioning the stethoscope diaphragm over the cardiac or pulmonary regions, likely assessing heart sounds (cardiovascular system) or breath sounds (respiratory system). This image illustrates the standard clinical procedure for non-invasive diagnostic monitoring and physical assessment in a medical education context. Relevant medical concepts include auscultation, the cardiovascular examination (CVS), respiratory system (RS) assessment, and the use of medical devices in patient care.

A clinical photograph captured as a video frame depicting a clinician performing a physical examination on a male patient. The clinician is leaning over the patient and using a stethoscope to perform auscultation of the chest. The patient is lying in a supine position on a clinical examination table with the upper body exposed, facilitating access to thoracic landmarks. The clinician is shown positioning the stethoscope diaphragm over the cardiac or pulmonary regions, likely assessing heart sounds (cardiovascular system) or breath sounds (respiratory system). This image illustrates the standard clinical procedure for non-invasive diagnostic monitoring and physical assessment in a medical education context. Relevant medical concepts include auscultation, the cardiovascular examination (CVS), respiratory system (RS) assessment, and the use of medical devices in patient care.

This historical anatomical illustration, sourced from the 1846 treatise 'The Young Stethoscopist' by Henry Ingersoll Bowditch, demonstrates three recommended patient positions for optimal thoracic auscultation. Figure 1 shows a frontal view of a standing patient with the torso exposed, facilitating examination of the anterior chest wall and cardiac landmarks. Figure 2 depicts a seated patient in a lateral profile, arms crossed over the chest and leaning slightly forward; this maneuver protracts the scapulae, providing unobstructed access to the posterior lung fields and interscapular regions. Figure 3 illustrates a standing profile with both hands clasped behind the head, a position that elevates the rib cage and exposes the lateral thoracic and axillary regions for comprehensive pulmonary assessment. These illustrations serve as an early educational guide for medical students to master physical examination techniques, emphasizing the importance of patient positioning in detecting respiratory murmurs and adventitious lung sounds. The content represents a significant development in clinical semiology and the history of diagnostic medicine.

This historical anatomical illustration, sourced from the 1846 treatise 'The Young Stethoscopist' by Henry Ingersoll Bowditch, demonstrates three recommended patient positions for optimal thoracic auscultation. Figure 1 shows a frontal view of a standing patient with the torso exposed, facilitating examination of the anterior chest wall and cardiac landmarks. Figure 2 depicts a seated patient in a lateral profile, arms crossed over the chest and leaning slightly forward; this maneuver protracts the scapulae, providing unobstructed access to the posterior lung fields and interscapular regions. Figure 3 illustrates a standing profile with both hands clasped behind the head, a position that elevates the rib cage and exposes the lateral thoracic and axillary regions for comprehensive pulmonary assessment. These illustrations serve as an early educational guide for medical students to master physical examination techniques, emphasizing the importance of patient positioning in detecting respiratory murmurs and adventitious lung sounds. The content represents a significant development in clinical semiology and the history of diagnostic medicine.

This clinical photograph depicts a pediatric physical examination conducted in an outdoor or informal healthcare setting. A healthcare professional, wearing blue personal protective equipment (PPE) including a surgical cap, face mask, and scrubs, is performing auscultation of a young child's chest using a stethoscope. The pediatric patient is also wearing a protective white face mask, indicating adherence to infection control protocols during a medical consultation. The child is actively participating by helping to position the stethoscope diaphragm against their chest. This image illustrates concepts of primary care, pediatric cardiology or pulmonology, and global health outreach. The presence of comprehensive PPE for both the provider and patient highlights the importance of respiratory hygiene and airborne pathogen mitigation in clinical practice.

This clinical photograph depicts a pediatric physical examination conducted in an outdoor or informal healthcare setting. A healthcare professional, wearing blue personal protective equipment (PPE) including a surgical cap, face mask, and scrubs, is performing auscultation of a young child's chest using a stethoscope. The pediatric patient is also wearing a protective white face mask, indicating adherence to infection control protocols during a medical consultation. The child is actively participating by helping to position the stethoscope diaphragm against their chest. This image illustrates concepts of primary care, pediatric cardiology or pulmonology, and global health outreach. The presence of comprehensive PPE for both the provider and patient highlights the importance of respiratory hygiene and airborne pathogen mitigation in clinical practice.

Finding Sources
Finding Sources
Searching Images

JVP jugular venous pressure cardiovascular examination neck

This clinical photograph demonstrates the positioning for a bedside assessment of Jugular Venous Pressure (JVP). The patient is shown in a semi-recumbent position, with the head of the bed typically elevated to approximately 30–45 degrees to allow for optimal visualization of the venous pulsations. The patient's head is slightly rotated to the left to expose the right side of the neck. A blue dotted line is superimposed on the skin to indicate the anatomical course of the internal jugular vein (IJV), which typically runs deep to the sternocleidomastoid muscle between its sternal and clavicular heads. The image illustrates a key step in physical examination for estimating central venous pressure (CVP) and assessing volume status in cardiovascular and internal medicine. The educational focus is on identifying the surface anatomy relevant to the IJV and the standardized patient positioning required to measure the vertical distance of the venous column above the sternal angle of Louis.

This clinical photograph demonstrates the positioning for a bedside assessment of Jugular Venous Pressure (JVP). The patient is shown in a semi-recumbent position, with the head of the bed typically elevated to approximately 30–45 degrees to allow for optimal visualization of the venous pulsations. The patient's head is slightly rotated to the left to expose the right side of the neck. A blue dotted line is superimposed on the skin to indicate the anatomical course of the internal jugular vein (IJV), which typically runs deep to the sternocleidomastoid muscle between its sternal and clavicular heads. The image illustrates a key step in physical examination for estimating central venous pressure (CVP) and assessing volume status in cardiovascular and internal medicine. The educational focus is on identifying the surface anatomy relevant to the IJV and the standardized patient positioning required to measure the vertical distance of the venous column above the sternal angle of Louis.

Two-panel B-mode diagnostic ultrasound image demonstrating the assessment of Ultrasound-measured Jugular Venous Pressure (U-JVP) in a semi-recumbent patient. The top panel shows a transverse (short-axis) view of the neck vasculature. The common carotid artery (CCA) appears as a prominent, non-compressible, round anechoic structure. Adjacent to it, a green arrow indicates the collapsed internal jugular vein (IJV), which lacks a patent lumen. The bottom panel displays a longitudinal (long-axis) view of the same region. The internal jugular vein is seen tapering as it moves superiorly, with the red arrow marking the specific 'collapse point' where the anterior and posterior walls of the vein meet. This technique is used in clinical cardiology and emergency medicine as a non-invasive bedside proxy for central venous pressure (CVP) and fluid status assessment, particularly when physical examination of jugular venous distension is difficult.

Two-panel B-mode diagnostic ultrasound image demonstrating the assessment of Ultrasound-measured Jugular Venous Pressure (U-JVP) in a semi-recumbent patient. The top panel shows a transverse (short-axis) view of the neck vasculature. The common carotid artery (CCA) appears as a prominent, non-compressible, round anechoic structure. Adjacent to it, a green arrow indicates the collapsed internal jugular vein (IJV), which lacks a patent lumen. The bottom panel displays a longitudinal (long-axis) view of the same region. The internal jugular vein is seen tapering as it moves superiorly, with the red arrow marking the specific 'collapse point' where the anterior and posterior walls of the vein meet. This technique is used in clinical cardiology and emergency medicine as a non-invasive bedside proxy for central venous pressure (CVP) and fluid status assessment, particularly when physical examination of jugular venous distension is difficult.

This clinical photograph demonstrates a novel technique for measuring jugular venous pressure (JVP) in a patient with heart failure. The image shows the lateral neck of an adult male where a bedside vein finder emits a rectangular green light to enhance the visualization of the external jugular vein (EJV). Within the illuminated area, the EJV appears as a darker, distended Y-shaped structure. Simultaneously, a clinician is using a 'venous arch' (or jugulometer)—a curved, translucent plastic tube with black and red calibration markings—to measure the vertical height of the venous column. One end of the arch is placed at the level of the sternal angle (not fully visible) while the other aligns with the venous meniscus on the neck. This procedure aims to estimate central venous pressure (CVP) by adding the vertical height measured to the 5 cm distance from the sternal angle to the right atrium. This method is particularly useful in patients where physical assessment of JVP is complicated by obesity or specific body habitus.

This clinical photograph demonstrates a novel technique for measuring jugular venous pressure (JVP) in a patient with heart failure. The image shows the lateral neck of an adult male where a bedside vein finder emits a rectangular green light to enhance the visualization of the external jugular vein (EJV). Within the illuminated area, the EJV appears as a darker, distended Y-shaped structure. Simultaneously, a clinician is using a 'venous arch' (or jugulometer)—a curved, translucent plastic tube with black and red calibration markings—to measure the vertical height of the venous column. One end of the arch is placed at the level of the sternal angle (not fully visible) while the other aligns with the venous meniscus on the neck. This procedure aims to estimate central venous pressure (CVP) by adding the vertical height measured to the 5 cm distance from the sternal angle to the right atrium. This method is particularly useful in patients where physical assessment of JVP is complicated by obesity or specific body habitus.

Searching Images

percussion notes lung consolidation pneumothorax effusion

This composite figure includes a frontal chest X-ray (Image A) and an axial thoracic CT scan (Image B) illustrating severe pulmonary complications. Image A shows extensive dense consolidation in the right upper and middle lobes, consistent with lobar pneumonia. A horizontal fluid level or dense opacity in the right lower zone indicates pleural effusion or atelectasis, while a peripherally lucent area suggests a concurrent pneumothorax. The left lung exhibits milder, patchy infiltrates. Image B provides a detailed cross-sectional view, revealing a significant right-sided pneumothorax with subsequent compression of the lung parenchyma. Bilateral abnormalities are evident, including dense consolidation and atelectasis in the dependent regions of both lungs, along with diffuse ground-glass opacities. These findings are clinically relevant to cases of gastrobronchial fistula, where gastric juice reflux induces severe necrotizing pneumonia and secondary spontaneous pneumothorax. The imaging highlights the severity of pulmonary involvement in patients with complex post-surgical or fistulous complications.

This composite figure includes a frontal chest X-ray (Image A) and an axial thoracic CT scan (Image B) illustrating severe pulmonary complications. Image A shows extensive dense consolidation in the right upper and middle lobes, consistent with lobar pneumonia. A horizontal fluid level or dense opacity in the right lower zone indicates pleural effusion or atelectasis, while a peripherally lucent area suggests a concurrent pneumothorax. The left lung exhibits milder, patchy infiltrates. Image B provides a detailed cross-sectional view, revealing a significant right-sided pneumothorax with subsequent compression of the lung parenchyma. Bilateral abnormalities are evident, including dense consolidation and atelectasis in the dependent regions of both lungs, along with diffuse ground-glass opacities. These findings are clinically relevant to cases of gastrobronchial fistula, where gastric juice reflux induces severe necrotizing pneumonia and secondary spontaneous pneumothorax. The imaging highlights the severity of pulmonary involvement in patients with complex post-surgical or fistulous complications.

This diagnostic image is an axial computed tomography (CT) scan of the thorax, presented in a lung window. The image demonstrates a significant right-sided pneumothorax, characterized by an extensive collection of air in the pleural space, resulting in a substantial partial collapse of the right lung. Within the collapsed right lung, there is evidence of pulmonary consolidation and ground-glass opacities, particularly in the dependent regions, which is suggestive of lobar pneumonia or associated inflammation. In contrast, the left lung (labeled on the right side of the image) appears well-aerated with normal vascular markings and a clear bronchogram, without signs of consolidation or pleural effusion. The mediastinum shows a slight shift toward the left, secondary to the pressure exerted by the large right-sided pneumothorax. This scan is illustrative for medical students and clinicians studying emergency respiratory conditions, thoracic trauma, or complications of pulmonary infections like pneumonia.

This diagnostic image is an axial computed tomography (CT) scan of the thorax, presented in a lung window. The image demonstrates a significant right-sided pneumothorax, characterized by an extensive collection of air in the pleural space, resulting in a substantial partial collapse of the right lung. Within the collapsed right lung, there is evidence of pulmonary consolidation and ground-glass opacities, particularly in the dependent regions, which is suggestive of lobar pneumonia or associated inflammation. In contrast, the left lung (labeled on the right side of the image) appears well-aerated with normal vascular markings and a clear bronchogram, without signs of consolidation or pleural effusion. The mediastinum shows a slight shift toward the left, secondary to the pressure exerted by the large right-sided pneumothorax. This scan is illustrative for medical students and clinicians studying emergency respiratory conditions, thoracic trauma, or complications of pulmonary infections like pneumonia.

Anterior-posterior (AP) chest X-ray demonstrating a focal area of increased opacity in the left lower lobe, consistent with pulmonary consolidation and pneumonia. A red circle highlights the affected region, while a red arrow points to the blunting of the left costophrenic angle, indicating a trace pleural effusion. The right lung appears clear with no pneumothorax or visible focal consolidations. A thin, radiopaque medical line (likely a central venous catheter or monitoring lead) is visible traversing the upper chest toward the right atrium. The cardiac silhouette and mediastinal contours are within normal limits for an AP projection. No obvious fractures or osseous lesions are identified in the ribs or clavicles. This image serves as a clinical example of community-acquired or secondary pneumonia in an adult patient, illustrating key radiological markers of lower respiratory infection and associated parapneumonic effusion.

Anterior-posterior (AP) chest X-ray demonstrating a focal area of increased opacity in the left lower lobe, consistent with pulmonary consolidation and pneumonia. A red circle highlights the affected region, while a red arrow points to the blunting of the left costophrenic angle, indicating a trace pleural effusion. The right lung appears clear with no pneumothorax or visible focal consolidations. A thin, radiopaque medical line (likely a central venous catheter or monitoring lead) is visible traversing the upper chest toward the right atrium. The cardiac silhouette and mediastinal contours are within normal limits for an AP projection. No obvious fractures or osseous lesions are identified in the ribs or clavicles. This image serves as a clinical example of community-acquired or secondary pneumonia in an adult patient, illustrating key radiological markers of lower respiratory infection and associated parapneumonic effusion.

Searching Images

abdominal examination palpation liver spleen organomegaly

This clinical photograph captures a postmortem examination of the abdominal and thoracic cavities, demonstrating severe visceral manifestations of visceral leishmaniasis. The primary focus is on massive splenomegaly; the spleen is markedly enlarged, extending deep into the abdominal cavity with a characteristic bluish-purple, mottled discoloration and a smooth but distorted capsule. Adjacent to it, significant hepatomegaly is evident; the liver appears enlarged with a brown, smooth, and slightly reflective serosal surface. Other visible structures include the dissected rib cage at the superior margin, a distended gallbladder with a greenish hue located inferior to the liver, and pale, pinkish intestinal loops partially retracted by a gloved hand. The image serves as a pathological illustration of the systemic impact of Leishmania infection on the reticuloendothelial system, specifically highlighting the extreme organomegaly that occurs in advanced or poorly responsive cases.

This clinical photograph captures a postmortem examination of the abdominal and thoracic cavities, demonstrating severe visceral manifestations of visceral leishmaniasis. The primary focus is on massive splenomegaly; the spleen is markedly enlarged, extending deep into the abdominal cavity with a characteristic bluish-purple, mottled discoloration and a smooth but distorted capsule. Adjacent to it, significant hepatomegaly is evident; the liver appears enlarged with a brown, smooth, and slightly reflective serosal surface. Other visible structures include the dissected rib cage at the superior margin, a distended gallbladder with a greenish hue located inferior to the liver, and pale, pinkish intestinal loops partially retracted by a gloved hand. The image serves as a pathological illustration of the systemic impact of Leishmania infection on the reticuloendothelial system, specifically highlighting the extreme organomegaly that occurs in advanced or poorly responsive cases.

A clinical photograph of an adolescent patient's abdomen demonstrating significant jaundice (icterus) and organomegaly associated with acute Epstein-Barr virus (EBV) infection. The skin exhibits a diffuse, pathological yellowish discoloration. Dark ink markings are present on the abdominal surface to clinically delineate the inferior margins of the liver and spleen, indicating hepatosplenomegaly. The liver margin is traced across the right upper quadrant, while the splenic margin extends significantly below the left costal margin towards the umbilicus. The abdomen appears moderately distended with a rounded contour. This visual serves as a classic clinical representation of infectious mononucleosis complicated by hepatitis and cholestasis. The image is intended for medical education regarding the physical examination findings of hepatobiliary and reticuloendothelial involvement in systemic viral infections.

A clinical photograph of an adolescent patient's abdomen demonstrating significant jaundice (icterus) and organomegaly associated with acute Epstein-Barr virus (EBV) infection. The skin exhibits a diffuse, pathological yellowish discoloration. Dark ink markings are present on the abdominal surface to clinically delineate the inferior margins of the liver and spleen, indicating hepatosplenomegaly. The liver margin is traced across the right upper quadrant, while the splenic margin extends significantly below the left costal margin towards the umbilicus. The abdomen appears moderately distended with a rounded contour. This visual serves as a classic clinical representation of infectious mononucleosis complicated by hepatitis and cholestasis. The image is intended for medical education regarding the physical examination findings of hepatobiliary and reticuloendothelial involvement in systemic viral infections.

This diagnostic image is an axial contrast-enhanced CT scan of the upper abdomen. The primary findings include mild hepatomegaly and splenomegaly (enlargement of the liver and spleen). The liver parenchyma appears relatively homogeneous without focal mass lesions or obvious biliary dilatation. The spleen is prominently sized, extending anteriorly and medially. Other visible anatomical structures include the vertebral column and posterior paraspinal musculature, the abdominal aorta, the stomach containing gas and heterogeneous content, and the surrounding abdominal wall. The scan is utilized in the context of acute liver injury to assess for gross anatomical abnormalities or signs of chronic liver disease, such as cirrhosis or portal hypertension. The educational focus is on identifying organomegaly in the setting of acute hepatitis or drug-induced liver injury (DILI).

This diagnostic image is an axial contrast-enhanced CT scan of the upper abdomen. The primary findings include mild hepatomegaly and splenomegaly (enlargement of the liver and spleen). The liver parenchyma appears relatively homogeneous without focal mass lesions or obvious biliary dilatation. The spleen is prominently sized, extending anteriorly and medially. Other visible anatomical structures include the vertebral column and posterior paraspinal musculature, the abdominal aorta, the stomach containing gas and heterogeneous content, and the surrounding abdominal wall. The scan is utilized in the context of acute liver injury to assess for gross anatomical abnormalities or signs of chronic liver disease, such as cirrhosis or portal hypertension. The educational focus is on identifying organomegaly in the setting of acute hepatitis or drug-induced liver injury (DILI).

Searching Images

neurological examination reflex tendon motor assessment

A clinical photograph demonstrating a physical examination technique for neurological assessment. The patient is positioned supine on an examination table with the lower extremities extended. An examiner, wearing a white clinical coat, is shown performing percussion using a Queen Square-style reflex hammer. The examiner's right hand holds the long, flexible handle of the hammer, poised to strike the medial epicondyle of the femur. The examiner's left hand is placed on the patient's distal thigh to stabilize the limb and palpate the anatomical landmarks. This procedural image illustrates the elicitation of a deep tendon reflex or periosteal reflex, specifically focusing on the medial aspect of the knee. The visual highlights the correct patient positioning, instrument grip, and anatomical targeting required for a standard neurological motor system evaluation.

A clinical photograph demonstrating a physical examination technique for neurological assessment. The patient is positioned supine on an examination table with the lower extremities extended. An examiner, wearing a white clinical coat, is shown performing percussion using a Queen Square-style reflex hammer. The examiner's right hand holds the long, flexible handle of the hammer, poised to strike the medial epicondyle of the femur. The examiner's left hand is placed on the patient's distal thigh to stabilize the limb and palpate the anatomical landmarks. This procedural image illustrates the elicitation of a deep tendon reflex or periosteal reflex, specifically focusing on the medial aspect of the knee. The visual highlights the correct patient positioning, instrument grip, and anatomical targeting required for a standard neurological motor system evaluation.

This clinical photograph demonstrates the proper technique for eliciting the patellar tendon reflex (knee jerk) in a sitting position, incorporating the Jendrassik maneuver. The patient is seated on an examination table with legs hanging freely and knees flexed at a 90-degree angle, ensuring the feet do not touch the floor to allow for unobstructed lower leg extension. Simultaneously, the patient performs the Jendrassik maneuver by interlocking their fingers and attempting to pull their hands apart, a reinforcement technique designed to facilitate deep tendon reflexes (DTR) by reducing conscious inhibition and increasing upper motor neuron activation. The examiner, standing to the patient's side, is seen using a neurological reflex hammer to strike the patellar tendon just below the patella. This procedure tests the L3-L4 spinal segments and the femoral nerve. The image serves as an educational guide for neurological physical examination, highlighting proper patient positioning, the use of reinforcement maneuvers, and the anatomical striking point for DTR assessment.

This clinical photograph demonstrates the proper technique for eliciting the patellar tendon reflex (knee jerk) in a sitting position, incorporating the Jendrassik maneuver. The patient is seated on an examination table with legs hanging freely and knees flexed at a 90-degree angle, ensuring the feet do not touch the floor to allow for unobstructed lower leg extension. Simultaneously, the patient performs the Jendrassik maneuver by interlocking their fingers and attempting to pull their hands apart, a reinforcement technique designed to facilitate deep tendon reflexes (DTR) by reducing conscious inhibition and increasing upper motor neuron activation. The examiner, standing to the patient's side, is seen using a neurological reflex hammer to strike the patellar tendon just below the patella. This procedure tests the L3-L4 spinal segments and the femoral nerve. The image serves as an educational guide for neurological physical examination, highlighting proper patient positioning, the use of reinforcement maneuvers, and the anatomical striking point for DTR assessment.

A clinical photograph demonstrating the procedural technique for eliciting the Achilles tendon reflex (ankle jerk) with the patient in a supine position using the 'figure four' modification. The patient is lying supine with the tested leg flexed at the knee and the lateral malleolus resting on the contralateral shin. An examiner’s hand is seen applying gentle passive dorsiflexion to the foot to put the Achilles tendon under tension. Simultaneously, a neurological reflex hammer with a metallic handle and a rubber head is positioned to strike the tendon. This maneuver targets the S1 and S2 nerve roots and the tibial nerve, evaluating the integrity of the lower motor neuron reflex arc. The image illustrates proper limb positioning, tendon stretching, and tool orientation for physical examination training in neurology and primary care.

A clinical photograph demonstrating the procedural technique for eliciting the Achilles tendon reflex (ankle jerk) with the patient in a supine position using the 'figure four' modification. The patient is lying supine with the tested leg flexed at the knee and the lateral malleolus resting on the contralateral shin. An examiner’s hand is seen applying gentle passive dorsiflexion to the foot to put the Achilles tendon under tension. Simultaneously, a neurological reflex hammer with a metallic handle and a rubber head is positioned to strike the tendon. This maneuver targets the S1 and S2 nerve roots and the tibial nerve, evaluating the integrity of the lower motor neuron reflex arc. The image illustrates proper limb positioning, tendon stretching, and tool orientation for physical examination training in neurology and primary care.

Searching Images

heart sounds murmur auscultation cardiac

This flowchart illustrates the signal processing methodology for the automated segmentation and extraction of heart sound components, specifically the first (S1) and second (S2) heart sounds, denoted as CS1 and CS2. The process is divided into five sequential stages (Step A through Step E): 

1. Step A (Heart Sound Auscultation): Shows the raw digital phonocardiogram signal (ST) as a blue oscillatory waveform.
2. Step B (Heart Sound Preprocessing): Displays a filtered and normalized version of the signal (HST) in gray, reducing noise and baseline drift.
3. Step C (Envelope Extraction): Features a black waveform representing the extracted Viola integral-based envelope (HSE) that traces the signal peaks.
4. Step D (HS STMHT Extraction): Shows a magenta waveform (HS_STMHT) using the Short-Time Modified Hilbert Transform, with marked negative-to-positive points used to identify S1 and S2 centroids.
5. Step E (CS1 and CS2 Extraction): Demonstrates the final segmented cardiac cycle components, with CS1 segments in yellow and CS2 segments in cyan, separated by vertical hashed lines.

This educational diagram represents an advanced diagnostic algorithm for cardiovascular signal processing, aimed at enhancing automated cardiac auscultation.

This flowchart illustrates the signal processing methodology for the automated segmentation and extraction of heart sound components, specifically the first (S1) and second (S2) heart sounds, denoted as CS1 and CS2. The process is divided into five sequential stages (Step A through Step E): 1. Step A (Heart Sound Auscultation): Shows the raw digital phonocardiogram signal (ST) as a blue oscillatory waveform. 2. Step B (Heart Sound Preprocessing): Displays a filtered and normalized version of the signal (HST) in gray, reducing noise and baseline drift. 3. Step C (Envelope Extraction): Features a black waveform representing the extracted Viola integral-based envelope (HSE) that traces the signal peaks. 4. Step D (HS STMHT Extraction): Shows a magenta waveform (HS_STMHT) using the Short-Time Modified Hilbert Transform, with marked negative-to-positive points used to identify S1 and S2 centroids. 5. Step E (CS1 and CS2 Extraction): Demonstrates the final segmented cardiac cycle components, with CS1 segments in yellow and CS2 segments in cyan, separated by vertical hashed lines. This educational diagram represents an advanced diagnostic algorithm for cardiovascular signal processing, aimed at enhancing automated cardiac auscultation.

Phonocardiogram (PCG) analysis from a 23-year-old female patient with a benign innocent heart murmur. The image presents four stacked panels representing time-series data over an 0.8-second cardiac cycle. Panels 1 and 2 (PCG1 and PCG2) display the raw acoustic cardiac signal, highlighting the first heart sound (S1) at approximately 0.1 seconds and the second heart sound (S2) at approximately 0.4 seconds. Panel 3, the 'Murmurgram,' represents the difference signal between adjacent PCG cycles, appearing relatively flat with minor amplitude fluctuations, which is characteristic of non-pathological murmurs. Panel 4 is a Color Spectrogram (CSP) showing the frequency distribution (kHz) over time. The CSP indicates that the heart sounds and associated innocent murmur consist primarily of low-frequency components under 0.2 kHz (150-200 Hz), with minimal high-frequency extension. This diagnostic visualization is used in cardiology to differentiate between innocent physiological murmurs and pathological murmurs (e.g., VSD, ASD, or valvular stenosis) based on spectral density and temporal distribution between S1 and S2.

Phonocardiogram (PCG) analysis from a 23-year-old female patient with a benign innocent heart murmur. The image presents four stacked panels representing time-series data over an 0.8-second cardiac cycle. Panels 1 and 2 (PCG1 and PCG2) display the raw acoustic cardiac signal, highlighting the first heart sound (S1) at approximately 0.1 seconds and the second heart sound (S2) at approximately 0.4 seconds. Panel 3, the 'Murmurgram,' represents the difference signal between adjacent PCG cycles, appearing relatively flat with minor amplitude fluctuations, which is characteristic of non-pathological murmurs. Panel 4 is a Color Spectrogram (CSP) showing the frequency distribution (kHz) over time. The CSP indicates that the heart sounds and associated innocent murmur consist primarily of low-frequency components under 0.2 kHz (150-200 Hz), with minimal high-frequency extension. This diagnostic visualization is used in cardiology to differentiate between innocent physiological murmurs and pathological murmurs (e.g., VSD, ASD, or valvular stenosis) based on spectral density and temporal distribution between S1 and S2.

This diagnostic graphic displays cardiac acoustic data from a patient with Atrial Septal Defect (ASD). The visualization consists of four vertically aligned panels spanning a 0.7-second time frame. The top two panels show successive Phonocardiogram (PCG) waveforms (PCG1 and PCG2), identifying the first heart sound (S1) at approximately 0.05s and a clearly split second heart sound (S2) between 0.3s and 0.4s. The S2 split is highlighted with pink circles, indicating the asynchronous closure of the aortic and pulmonary valves. The third panel, labeled 'Murmurgram,' represents the subtraction of the two PCG cycles, revealing high-amplitude signal activity in the systolic interval between S1 and S2, which corresponds to a mid-systolic murmur. The bottom panel is a Cyclic Spectral Profile (CSP) or spectrogram, illustrating frequency components of the heart sounds and murmur. The murmur exhibits frequency peaks reaching approximately 400-600 Hz. This dataset serves as an educational tool for identifying the fixed splitting of S2 and the associated systolic murmur characteristic of ASD.

This diagnostic graphic displays cardiac acoustic data from a patient with Atrial Septal Defect (ASD). The visualization consists of four vertically aligned panels spanning a 0.7-second time frame. The top two panels show successive Phonocardiogram (PCG) waveforms (PCG1 and PCG2), identifying the first heart sound (S1) at approximately 0.05s and a clearly split second heart sound (S2) between 0.3s and 0.4s. The S2 split is highlighted with pink circles, indicating the asynchronous closure of the aortic and pulmonary valves. The third panel, labeled 'Murmurgram,' represents the subtraction of the two PCG cycles, revealing high-amplitude signal activity in the systolic interval between S1 and S2, which corresponds to a mid-systolic murmur. The bottom panel is a Cyclic Spectral Profile (CSP) or spectrogram, illustrating frequency components of the heart sounds and murmur. The murmur exhibits frequency peaks reaching approximately 400-600 Hz. This dataset serves as an educational tool for identifying the fixed splitting of S2 and the associated systolic murmur characteristic of ASD.

Searching Images

plantar reflex Babinski sign neurological examination foot

A clinical photograph depicting a neurological examination of the plantar reflex. The patient's leg is positioned in a 'figure four' configuration, characterized by moderate abduction and external rotation of the thigh with the knee flexed, while the examined leg is crossed over the shin of the opposite leg. An examiner uses a Babinski-style reflex hammer—featuring a slender white handle and a circular head with a metallic disk encased in a black rubber ring. The examiner is utilizing the sharpened tip of the handle to stroke the lateral aspect of the sole of the foot to elicit a cutaneous reflex response (Babinski sign). This procedural image demonstrates a common clinical technique for evaluating upper motor neuron integrity within a neurology or physical examination context.

A clinical photograph depicting a neurological examination of the plantar reflex. The patient's leg is positioned in a 'figure four' configuration, characterized by moderate abduction and external rotation of the thigh with the knee flexed, while the examined leg is crossed over the shin of the opposite leg. An examiner uses a Babinski-style reflex hammer—featuring a slender white handle and a circular head with a metallic disk encased in a black rubber ring. The examiner is utilizing the sharpened tip of the handle to stroke the lateral aspect of the sole of the foot to elicit a cutaneous reflex response (Babinski sign). This procedural image demonstrates a common clinical technique for evaluating upper motor neuron integrity within a neurology or physical examination context.

This composite educational graphic presents a comparison between clinical photography and art history to illustrate neurological signs. Panel A shows a clinical photograph of a human foot with a clearly extended (dorsiflexed) hallux (great toe) and slightly flexed lesser toes, a posture characteristic of the Babinski sign or voluntary extension. Panel B features a realistic painting, 'The Painter’s Foot' by Adolph von Menzel, depicting a foot with a similarly isolated extension of the great toe, used here to discuss the historical representation of potential neurological pathology versus anatomical realism. Panel C provides a comparative clinical photograph of a foot in a relaxed anatomical position with neutral toe alignment. The collection serves to teach medical students and neurology residents how to visually identify the extensor plantar response (Babinski sign), a key indicator of upper motor neuron dysfunction, and explores the diagnostic intersection between clinical observation and anatomical art.

This composite educational graphic presents a comparison between clinical photography and art history to illustrate neurological signs. Panel A shows a clinical photograph of a human foot with a clearly extended (dorsiflexed) hallux (great toe) and slightly flexed lesser toes, a posture characteristic of the Babinski sign or voluntary extension. Panel B features a realistic painting, 'The Painter’s Foot' by Adolph von Menzel, depicting a foot with a similarly isolated extension of the great toe, used here to discuss the historical representation of potential neurological pathology versus anatomical realism. Panel C provides a comparative clinical photograph of a foot in a relaxed anatomical position with neutral toe alignment. The collection serves to teach medical students and neurology residents how to visually identify the extensor plantar response (Babinski sign), a key indicator of upper motor neuron dysfunction, and explores the diagnostic intersection between clinical observation and anatomical art.

Searching Images

jaundice scleral icterus liver disease physical signs

Clinical photograph comparison of a patient's eyes demonstrating the resolution of jaundice. Panel (a) shows bilateral scleral icterus, characterized by a distinct yellowing of the sclera and bulbar conjunctiva, marked with blue arrows. This appearance is secondary to hyperbilirubinemia often associated with hepatobiliary disease. Panel (b) shows the same patient after two weeks of treatment, demonstrating a marked reduction in the yellow hue. The sclera has returned to a near-normal white color, indicating a decrease in systemic bilirubin levels and successful therapeutic intervention. This side-by-side comparison serves as an educational tool for identifying physical signs of liver dysfunction and monitoring clinical progression during treatment.

Clinical photograph comparison of a patient's eyes demonstrating the resolution of jaundice. Panel (a) shows bilateral scleral icterus, characterized by a distinct yellowing of the sclera and bulbar conjunctiva, marked with blue arrows. This appearance is secondary to hyperbilirubinemia often associated with hepatobiliary disease. Panel (b) shows the same patient after two weeks of treatment, demonstrating a marked reduction in the yellow hue. The sclera has returned to a near-normal white color, indicating a decrease in systemic bilirubin levels and successful therapeutic intervention. This side-by-side comparison serves as an educational tool for identifying physical signs of liver dysfunction and monitoring clinical progression during treatment.

A composite of nine clinical photographs (a-i) illustrating various dermatological and systemic manifestations associated with chronic liver disease and cirrhosis. (a) Displays loss of pubic hair. (b) Shows bilateral gynecomastia in a male patient. (c) Features scleral icterus (jaundice) visible in the eye. (d) Demonstrates prurigo nodularis on the lower leg, characterized by multiple hyperkeratotic, crusty, and excoriated nodules on thickened skin. (e) Shows bilateral xanthelasma, manifesting as yellowish, planar lipid deposits around the eyelids. (f) Exhibits 'hepatic facies' with a muddy-gray, hyperpigmented complexion and pronounced facial wrinkling. (g) Displays digital hyperpigmentation. (h) Shows anterior tibial pigmentation, likely due to hemosiderin deposition. (i) Illustrates a chronic leg ulcer on the lower extremity with surrounding stasis changes and necrotic tissue. This collection serves as a diagnostic educational resource for identifying the physical signs of impaired hormone metabolism and portal hypertension in liver pathology.

A composite of nine clinical photographs (a-i) illustrating various dermatological and systemic manifestations associated with chronic liver disease and cirrhosis. (a) Displays loss of pubic hair. (b) Shows bilateral gynecomastia in a male patient. (c) Features scleral icterus (jaundice) visible in the eye. (d) Demonstrates prurigo nodularis on the lower leg, characterized by multiple hyperkeratotic, crusty, and excoriated nodules on thickened skin. (e) Shows bilateral xanthelasma, manifesting as yellowish, planar lipid deposits around the eyelids. (f) Exhibits 'hepatic facies' with a muddy-gray, hyperpigmented complexion and pronounced facial wrinkling. (g) Displays digital hyperpigmentation. (h) Shows anterior tibial pigmentation, likely due to hemosiderin deposition. (i) Illustrates a chronic leg ulcer on the lower extremity with surrounding stasis changes and necrotic tissue. This collection serves as a diagnostic educational resource for identifying the physical signs of impaired hormone metabolism and portal hypertension in liver pathology.

Excellent! I have rich content and images. Now let me build the comprehensive PPTX:
Running Command

mkdir -p /tmp/workspace/systemic-exam-ppt && ls /tmp/workspace/systemic-exam-ppt/

?

It looks like the previous session timed out before the PPT could be built. I have all the content and images ready — let me complete it now!
Running Command

mkdir -p /tmp/workspace/systemic-exam-ppt && python /tmp/skills/shared/scripts/fetch_images.py \ "https://cdn.orris.care/cdss_images/pmc_clinical_VQA_81a5258f41299fc026cdf9329d826db5021038ce217a8ba40b41ef74f19a0820.jpg" \ "https://cdn.orris.care/cdss_images/pmc_clinical_VQA_7579570ccbf69e539c1688067de9e7782bde674c80d7db0396fd9542082cf1f7.jpg" \ "https://cdn.orris.care/cdss_images/pmc_clinical_VQA_b862e31b5c8b51ce6dc1fbafd8916cd21f449fca24d6b0fc8443445b8157a825.jpg" \ "https://cdn.orris.care/cdss_images/pmc_clinical_VQA_468b985e1b329f8d924765ab81ffabbb95ce1caf122a71672abd10ccff33359c.jpg" \ "https://cdn.orris.care/cdss_images/pmc_clinical_VQA_478d74974a93434c9f097dc4a7e5833344fb1b6eb3b2cd4c88eb794f28bea401.jpg" \ "https://cdn.orris.care/cdss_images/pmc_clinical_VQA_2cf74e492f1faa3f2caf6656da1935e09de76884443d31f5d670e78065869e70.jpg" \ "https://cdn.orris.care/cdss_images/pmc_clinical_VQA_4d033b199c9c19d09d67819c668ad35a525c5ec78b6ea4044b05d3219def06c2.jpg" \ "https://cdn.orris.care/cdss_images/pmc_clinical_VQA_6c2816087b6f8412fa2c06fbe6aa1639544fb615bf5fd9dab7406a72ac304aaf.jpg" \ "https://cdn.orris.care/cdss_images/pmc_clinical_VQA_e034bc783baface3d65666b0a8ae0dc9aa43e261f01230d774b0b743d7202a29.jpg" \ "https://cdn.orris.care/cdss_images/pmc_clinical_VQA_a5aa1577a309b773aa904acf5993f3f7cab2b262bc0571b2b34fc3412c419fb7.jpg" \ > /tmp/workspace/systemic-exam-ppt/images.json 2>&1 echo "Exit: $?" wc -c /tmp/workspace/systemic-exam-ppt/images.json

Images downloaded. Now building the full PPT:
Writing File

~/systemic-exam-ppt/build_ppt.py

import json, base64
from io import BytesIO
from pptx import Presentation
from pptx.util import Inches, Pt, Emu
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN
from pptx.util import Inches, Pt, Cm
import copy

# ── load images ──────────────────────────────────────────────────────────────
with open("/tmp/workspace/systemic-exam-ppt/images.json") as f:
    IMG_DATA = json.load(f)

URLS = [
    "https://cdn.orris.care/cdss_images/pmc_clinical_VQA_81a5258f41299fc026cdf9329d826db5021038ce217a8ba40b41ef74f19a0820.jpg",   # 0 clubbing bilateral
    "https://cdn.orris.care/cdss_images/pmc_clinical_VQA_7579570ccbf69e539c1688067de9e7782bde674c80d7db0396fd9542082cf1f7.jpg",   # 1 chest auscultation
    "https://cdn.orris.care/cdss_images/pmc_clinical_VQA_b862e31b5c8b51ce6dc1fbafd8916cd21f449fca24d6b0fc8443445b8157a825.jpg",   # 2 JVP neck
    "https://cdn.orris.care/cdss_images/pmc_clinical_VQA_468b985e1b329f8d924765ab81ffabbb95ce1caf122a71672abd10ccff33359c.jpg",   # 3 CXR pneumonia consolidation
    "https://cdn.orris.care/cdss_images/pmc_clinical_VQA_478d74974a93434c9f097dc4a7e5833344fb1b6eb3b2cd4c88eb794f28bea401.jpg",   # 4 hepatosplenomegaly abdomen
    "https://cdn.orris.care/cdss_images/pmc_clinical_VQA_2cf74e492f1faa3f2caf6656da1935e09de76884443d31f5d670e78065869e70.jpg",   # 5 knee jerk reflex
    "https://cdn.orris.care/cdss_images/pmc_clinical_VQA_4d033b199c9c19d09d67819c668ad35a525c5ec78b6ea4044b05d3219def06c2.jpg",   # 6 Babinski plantar
    "https://cdn.orris.care/cdss_images/pmc_clinical_VQA_6c2816087b6f8412fa2c06fbe6aa1639544fb615bf5fd9dab7406a72ac304aaf.jpg",   # 7 scleral icterus
    "https://cdn.orris.care/cdss_images/pmc_clinical_VQA_e034bc783baface3d65666b0a8ae0dc9aa43e261f01230d774b0b743d7202a29.jpg",   # 8 liver disease signs
    "https://cdn.orris.care/cdss_images/pmc_clinical_VQA_a5aa1577a309b773aa904acf5993f3f7cab2b262bc0571b2b34fc3412c419fb7.jpg",   # 9 auscultation supine
]

def img_stream(idx):
    for item in IMG_DATA:
        if item["url"] == URLS[idx] and item.get("base64"):
            raw = base64.b64decode(item["base64"].split(",")[-1])
            return BytesIO(raw)
    return None

# ── colour palette ────────────────────────────────────────────────────────────
DARK_BLUE   = RGBColor(0x1A, 0x3A, 0x5C)
MID_BLUE    = RGBColor(0x2E, 0x6D, 0xA4)
TEAL        = RGBColor(0x00, 0x7B, 0x83)
GREEN       = RGBColor(0x1E, 0x7A, 0x3E)
ORANGE      = RGBColor(0xE0, 0x6C, 0x00)
PURPLE      = RGBColor(0x5B, 0x2D, 0x8E)
RED         = RGBColor(0xC0, 0x20, 0x20)
LIGHT_BLUE  = RGBColor(0xD6, 0xE8, 0xF7)
LIGHT_GREEN = RGBColor(0xD6, 0xF0, 0xE0)
LIGHT_TEAL  = RGBColor(0xD0, 0xF0, 0xF4)
LIGHT_ORANGE= RGBColor(0xFD, 0xEE, 0xD8)
LIGHT_PURPLE= RGBColor(0xEEE0FF)
WHITE       = RGBColor(0xFF, 0xFF, 0xFF)
NEAR_WHITE  = RGBColor(0xF8, 0xF8, 0xF8)
GRAY        = RGBColor(0x66, 0x66, 0x66)
DARK_GRAY   = RGBColor(0x33, 0x33, 0x33)
ACCENT_GOLD = RGBColor(0xE8, 0xA0, 0x20)

# ── presentation setup ────────────────────────────────────────────────────────
prs = Presentation()
prs.slide_width  = Inches(13.33)
prs.slide_height = Inches(7.5)
W = prs.slide_width
H = prs.slide_height
BLANK = prs.slide_layouts[6]   # completely blank

# ── helpers ───────────────────────────────────────────────────────────────────
def add_rect(slide, l, t, w, h, fill=None, line=None, line_w=Pt(0)):
    shape = slide.shapes.add_shape(1, l, t, w, h)  # MSO_SHAPE_TYPE.RECTANGLE=1
    shape.line.fill.background()
    if fill:
        shape.fill.solid()
        shape.fill.fore_color.rgb = fill
    else:
        shape.fill.background()
    if line:
        shape.line.color.rgb = line
        shape.line.width = line_w
    else:
        shape.line.fill.background()
    return shape

def add_text(slide, text, l, t, w, h, size=18, bold=False, color=DARK_GRAY,
             align=PP_ALIGN.LEFT, wrap=True, italic=False):
    txBox = slide.shapes.add_textbox(l, t, w, h)
    tf = txBox.text_frame
    tf.word_wrap = wrap
    p = tf.paragraphs[0]
    p.alignment = align
    run = p.add_run()
    run.text = text
    run.font.size = Pt(size)
    run.font.bold = bold
    run.font.italic = italic
    run.font.color.rgb = color
    return txBox

def add_text_para(slide, lines, l, t, w, h, size=13, bold_first=False,
                  color=DARK_GRAY, line_color=None, spacing=1.15):
    """lines = list of (text, bold, color_override) tuples or plain strings"""
    txBox = slide.shapes.add_textbox(l, t, w, h)
    tf = txBox.text_frame
    tf.word_wrap = True
    for i, item in enumerate(lines):
        if i == 0:
            p = tf.paragraphs[0]
        else:
            p = tf.add_paragraph()
        if isinstance(item, str):
            text, bld, col = item, (bold_first and i == 0), color
        else:
            text, bld, col = item[0], item[1], item[2] if len(item) > 2 else color
        p.alignment = PP_ALIGN.LEFT
        run = p.add_run()
        run.text = text
        run.font.size = Pt(size)
        run.font.bold = bld
        run.font.color.rgb = col
    return txBox

def section_header(slide, title, subtitle, bg_color, icon=""):
    """Full-width section header bar at top"""
    add_rect(slide, 0, 0, W, Inches(1.5), fill=bg_color)
    add_rect(slide, 0, Inches(1.5), W, Inches(6.0), fill=NEAR_WHITE)
    # accent left bar
    add_rect(slide, 0, 0, Inches(0.12), Inches(1.5), fill=ACCENT_GOLD)
    # title
    add_text(slide, f"{icon}  {title}", Inches(0.25), Inches(0.1),
             Inches(10), Inches(0.9), size=32, bold=True, color=WHITE)
    if subtitle:
        add_text(slide, subtitle, Inches(0.25), Inches(0.95),
                 Inches(12), Inches(0.45), size=14, color=RGBColor(0xC8, 0xDC, 0xEF))

def img_on_slide(slide, idx, l, t, w, h):
    s = img_stream(idx)
    if s:
        slide.shapes.add_picture(s, l, t, width=w, height=h)

def colored_bullet_box(slide, title, items, l, t, w, h, hdr_color, bullet_color,
                       title_size=15, item_size=12):
    """Box with coloured header + bullet items"""
    add_rect(slide, l, t, w, Inches(0.38), fill=hdr_color)
    add_text(slide, title, l + Inches(0.1), t + Inches(0.02),
             w - Inches(0.2), Inches(0.34), size=title_size, bold=True, color=WHITE)
    add_rect(slide, l, t + Inches(0.38), w, h - Inches(0.38),
             fill=WHITE, line=hdr_color, line_w=Pt(1.2))
    item_h = (h - Inches(0.38)) / max(len(items), 1)
    for i, item in enumerate(items):
        # bullet dot
        dot = slide.shapes.add_shape(9, l + Inches(0.12),
                                      t + Inches(0.38) + int(i * item_h) + Inches(0.09),
                                      Inches(0.12), Inches(0.12))
        dot.fill.solid(); dot.fill.fore_color.rgb = bullet_color
        dot.line.fill.background()
        add_text(slide, item,
                 l + Inches(0.3), t + Inches(0.38) + int(i * item_h) + Inches(0.03),
                 w - Inches(0.38), item_h - Inches(0.06),
                 size=item_size, color=DARK_GRAY)

def table_slide(slide, headers, rows, l, t, w, h, hdr_color, alt_color):
    """Draw a simple table"""
    n_cols = len(headers)
    n_rows = len(rows)
    col_w = w // n_cols
    row_h = h // (n_rows + 1)
    # header row
    for ci, hdr in enumerate(headers):
        add_rect(slide, l + ci*col_w, t, col_w, row_h, fill=hdr_color)
        add_text(slide, hdr, l + ci*col_w + Inches(0.08), t + Inches(0.04),
                 col_w - Inches(0.16), row_h - Inches(0.08),
                 size=12, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
    # data rows
    for ri, row in enumerate(rows):
        bg = alt_color if ri % 2 == 0 else WHITE
        for ci, cell in enumerate(row):
            add_rect(slide, l + ci*col_w, t + (ri+1)*row_h, col_w, row_h,
                     fill=bg, line=hdr_color, line_w=Pt(0.5))
            add_text(slide, cell,
                     l + ci*col_w + Inches(0.08), t + (ri+1)*row_h + Inches(0.03),
                     col_w - Inches(0.16), row_h - Inches(0.06),
                     size=11, color=DARK_GRAY)

def flow_box(slide, text, l, t, w, h, fill, text_color=WHITE, size=12, bold=True):
    add_rect(slide, l, t, w, h, fill=fill)
    add_text(slide, text, l+Inches(0.08), t+Inches(0.06),
             w-Inches(0.16), h-Inches(0.12), size=size, bold=bold,
             color=text_color, align=PP_ALIGN.CENTER)

def arrow_right(slide, l, t, h_center):
    """Draw a right-pointing arrow"""
    arr = slide.shapes.add_shape(13, l, h_center - Inches(0.12),
                                  Inches(0.3), Inches(0.24))  # right arrow
    arr.fill.solid(); arr.fill.fore_color.rgb = GRAY
    arr.line.fill.background()

def arrow_down(slide, l_center, t, height=Inches(0.3)):
    arr = slide.shapes.add_shape(131, l_center - Inches(0.12), t,
                                   Inches(0.24), height)
    arr.fill.solid(); arr.fill.fore_color.rgb = GRAY
    arr.line.fill.background()

# ═════════════════════════════════════════════════════════════════════════════
# SLIDE 1 — TITLE
# ═════════════════════════════════════════════════════════════════════════════
s = prs.slides.add_slide(BLANK)
add_rect(s, 0, 0, W, H, fill=DARK_BLUE)
add_rect(s, 0, 0, Inches(0.18), H, fill=ACCENT_GOLD)
add_rect(s, Inches(0.18), Inches(4.8), W - Inches(0.18), Inches(2.7),
         fill=RGBColor(0x0E, 0x24, 0x3A))

add_text(s, "SYSTEMIC EXAMINATION", Inches(0.5), Inches(0.9),
         Inches(12), Inches(1.3), size=44, bold=True, color=WHITE,
         align=PP_ALIGN.LEFT)
add_text(s, "OF THE PATIENT", Inches(0.5), Inches(2.1),
         Inches(12), Inches(1.0), size=44, bold=True, color=ACCENT_GOLD,
         align=PP_ALIGN.LEFT)
add_text(s, "A Comprehensive Clinical Reference  |  Respiratory  ·  Cardiovascular  ·  Abdominal  ·  Neurological  ·  Musculoskeletal",
         Inches(0.5), Inches(3.3), Inches(12), Inches(0.5),
         size=14, color=RGBColor(0xC8, 0xDC, 0xEF))
add_rect(s, Inches(0.5), Inches(3.9), Inches(3.5), Inches(0.05), fill=ACCENT_GOLD)

# System icons row
systems = [("🫁", "Respiratory"), ("❤️", "Cardiovascular"), ("🫃", "Abdominal"),
           ("🧠", "Neurological"), ("🦴", "Musculoskeletal")]
for i, (icon, label) in enumerate(systems):
    bx = Inches(0.5) + i * Inches(2.45)
    add_rect(s, bx, Inches(4.95), Inches(2.3), Inches(1.3),
             fill=RGBColor(0x20, 0x4A, 0x70))
    add_text(s, icon, bx, Inches(5.0), Inches(2.3), Inches(0.55),
             size=24, align=PP_ALIGN.CENTER, color=WHITE)
    add_text(s, label, bx, Inches(5.55), Inches(2.3), Inches(0.55),
             size=13, bold=True, color=WHITE, align=PP_ALIGN.CENTER)

add_text(s, "Orris Medical Reference  |  July 2026",
         Inches(0.5), Inches(7.0), Inches(6), Inches(0.35),
         size=10, color=GRAY, italic=True)

# ═════════════════════════════════════════════════════════════════════════════
# SLIDE 2 — OVERVIEW / APPROACH FLOWCHART
# ═════════════════════════════════════════════════════════════════════════════
s = prs.slides.add_slide(BLANK)
section_header(s, "Overview: Approach to Systemic Examination",
               "IPPA applied to each system — Inspection · Palpation · Percussion · Auscultation", DARK_BLUE)

add_text(s, "Sequential Head-to-Toe Examination Flowchart",
         Inches(0.3), Inches(1.65), Inches(12.7), Inches(0.38),
         size=15, bold=True, color=DARK_BLUE)

# Flowchart — 5 steps across
steps = [
    ("1\nGENERAL\nINSPECTION", TEAL),
    ("2\nRESPIRATORY\nSYSTEM", MID_BLUE),
    ("3\nCARDIO-\nVASCULAR", RED),
    ("4\nABDOMEN &\nGI SYSTEM", GREEN),
    ("5\nNEURO-\nLOGICAL", PURPLE),
]
for i, (label, col) in enumerate(steps):
    bx = Inches(0.3) + i * Inches(2.57)
    add_rect(s, bx, Inches(2.1), Inches(2.3), Inches(1.0), fill=col)
    add_text(s, label, bx, Inches(2.15), Inches(2.3), Inches(0.9),
             size=12, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
    if i < 4:
        arrow_right(s, bx + Inches(2.3), 0, Inches(2.6))

# Second row
steps2 = [
    ("6\nMUSCULO-\nSKELETAL", ORANGE),
    ("7\nSKIN &\nDERMATOLOGY", RGBColor(0x7B, 0x3F, 0x00)),
    ("8\nLYMPH\nNODES", RGBColor(0x5A, 0x5A, 0xAA)),
    ("9\nASSESSMENT\n& PLAN", DARK_BLUE),
]
for i, (label, col) in enumerate(steps2):
    bx = Inches(0.3) + i * Inches(3.25)
    add_rect(s, bx, Inches(3.6), Inches(2.9), Inches(0.9), fill=col)
    add_text(s, label, bx, Inches(3.65), Inches(2.9), Inches(0.8),
             size=12, bold=True, color=WHITE, align=PP_ALIGN.CENTER)

# IPPA reminder box
add_rect(s, Inches(0.3), Inches(4.65), Inches(12.7), Inches(0.55),
         fill=LIGHT_BLUE, line=MID_BLUE, line_w=Pt(1.5))
add_text(s, "📋  For EVERY system apply:   I — Inspection   →   P — Palpation   →   P — Percussion   →   A — Auscultation",
         Inches(0.5), Inches(4.7), Inches(12.3), Inches(0.45),
         size=14, bold=True, color=DARK_BLUE, align=PP_ALIGN.CENTER)

add_rect(s, Inches(0.3), Inches(5.35), Inches(12.7), Inches(0.55),
         fill=RGBColor(0xFF, 0xF3, 0xD6), line=ORANGE, line_w=Pt(1.5))
add_text(s, "⚠️  EXCEPTION — Abdomen:   I — Inspection   →   A — Auscultation   →   P — Palpation   →   P — Percussion",
         Inches(0.5), Inches(5.4), Inches(12.3), Inches(0.45),
         size=13, bold=True, color=ORANGE, align=PP_ALIGN.CENTER)

# key principle
add_rect(s, Inches(0.3), Inches(6.05), Inches(12.7), Inches(0.9),
         fill=NEAR_WHITE, line=TEAL, line_w=Pt(1))
add_text(s, '"The examination always follows the history and is focused on the patient\'s specific problem. '
            'Proper exposure is non-negotiable — never examine through clothing."',
         Inches(0.5), Inches(6.1), Inches(12.3), Inches(0.8),
         size=12, italic=True, color=GRAY)

# ═════════════════════════════════════════════════════════════════════════════
# SLIDE 3 — RESPIRATORY: INSPECTION
# ═════════════════════════════════════════════════════════════════════════════
s = prs.slides.add_slide(BLANK)
section_header(s, "Respiratory System — Inspection", "Step 1 of IPPA", TEAL)

# Left column — inspection checklist
colored_bullet_box(s, "🔍 Inspection — What to Look For",
    ["Rate, rhythm, depth of breathing",
     "Use of accessory muscles (SCM, scalenes, intercostals)",
     "Chest shape: barrel chest (COPD/emphysema), pigeon chest (pectus carinatum)",
     "Chest wall asymmetry — one side moves less",
     "Surgical scars (thoracotomy, VATS, drains)",
     "Tracheal position (deviated away = tension PTx; toward = collapse)",
     "Pursed-lip breathing (COPD)",
     "Nasal flaring, intercostal recession (children)",
     "Cyanosis — peripheral (nails/lips) vs central (tongue)"],
    Inches(0.3), Inches(1.65), Inches(5.5), Inches(4.4),
    TEAL, TEAL)

# Breathing patterns box
colored_bullet_box(s, "🌊 Abnormal Breathing Patterns",
    ["Cheyne-Stokes — crescendo-decrescendo cycles → CCF, uraemia, raised ICP",
     "Kussmaul — deep, laboured, rapid → metabolic acidosis (DKA)",
     "Biot's — irregular cycles with apnoeas → raised ICP, brainstem lesion",
     "Apnoeustic — prolonged inspiratory hold → pontine damage",
     "Sighing — anxiety, hyperventilation syndrome"],
    Inches(0.3), Inches(6.1), Inches(5.5), Inches(1.3),
    RGBColor(0x00, 0x5F, 0x73), RGBColor(0x00, 0x5F, 0x73), title_size=13, item_size=10)

# Right — real image of clubbing
img_on_slide(s, 0, Inches(6.05), Inches(1.65), Inches(4.0), Inches(2.7))
add_rect(s, Inches(6.05), Inches(4.35), Inches(4.0), Inches(0.35),
         fill=TEAL)
add_text(s, "Fig 1. Bilateral digital clubbing — drumstick appearance, loss of Lovibond angle",
         Inches(6.1), Inches(4.37), Inches(3.9), Inches(0.32),
         size=9, color=WHITE, italic=True)

# Clubbing grades table
add_text(s, "Grading of Clubbing", Inches(6.05), Inches(4.8),
         Inches(7.0), Inches(0.32), size=13, bold=True, color=DARK_BLUE)
table_slide(s,
    ["Grade", "Features"],
    [["I", "Softening & fluctuation of nail bed"],
     ["II", "Loss of Lovibond angle (>180°)"],
     ["III", "Drumstick appearance of distal phalanx"],
     ["IV", "Hypertrophic osteoarthropathy (periosteal new bone)"]],
    Inches(6.05), Inches(5.15), Inches(7.0), Inches(1.8),
    TEAL, LIGHT_TEAL)

# ═════════════════════════════════════════════════════════════════════════════
# SLIDE 4 — RESPIRATORY: PALPATION, PERCUSSION & AUSCULTATION
# ═════════════════════════════════════════════════════════════════════════════
s = prs.slides.add_slide(BLANK)
section_header(s, "Respiratory System — Palpation, Percussion & Auscultation",
               "Steps 2, 3 & 4 of IPPA", TEAL)

# Palpation
colored_bullet_box(s, "✋ Palpation",
    ["Tracheal position — index finger in suprasternal notch",
     "Chest expansion — hands on lower chest; normal ≥5 cm",
     "Tactile vocal fremitus — say '99'; increased = consolidation; decreased = effusion/PTx",
     "Apex beat — helps identify cardiac vs. respiratory pathology"],
    Inches(0.3), Inches(1.65), Inches(4.2), Inches(1.9), TEAL, TEAL, item_size=11)

# Percussion notes table
add_text(s, "🥁 Percussion Notes",
         Inches(0.3), Inches(3.65), Inches(4.2), Inches(0.32),
         size=13, bold=True, color=DARK_BLUE)
table_slide(s,
    ["Note", "Cause"],
    [["Resonant", "Normal lung"],
     ["Hyper-resonant", "Pneumothorax, emphysema"],
     ["Dull", "Consolidation, collapse, mass"],
     ["Stony dull", "Pleural effusion"],
     ["Tympanic", "Gas-filled cavity (pneumothorax)"]],
    Inches(0.3), Inches(4.0), Inches(4.2), Inches(2.6),
    TEAL, LIGHT_TEAL)

# Right side — CXR image
img_on_slide(s, 3, Inches(4.7), Inches(1.65), Inches(3.6), Inches(2.7))
add_rect(s, Inches(4.7), Inches(4.35), Inches(3.6), Inches(0.3), fill=TEAL)
add_text(s, "Fig 2. CXR: Left lower lobe consolidation + blunted costophrenic angle (effusion)",
         Inches(4.75), Inches(4.37), Inches(3.5), Inches(0.28), size=9, color=WHITE, italic=True)

# Auscultation
colored_bullet_box(s, "🔊 Auscultation — Breath Sounds & Added Sounds",
    ["Vesicular (normal) — soft, low-pitched, inspiration > expiration",
     "Bronchial — harsh, high-pitched, expiration ≥ inspiration → consolidation above effusion",
     "Diminished/absent — effusion, pneumothorax, obesity, collapse",
     "Fine crackles — pulmonary fibrosis, LVF (end-inspiratory)",
     "Coarse crackles — bronchiectasis, secretions (cleared by coughing)",
     "Wheeze (polyphonic) — diffuse airflow obstruction (asthma, COPD)",
     "Wheeze (monophonic fixed) — partial obstruction (tumour, foreign body)",
     "Pleural rub — pleuritis (low-pitched, leathery creaking, both phases)"],
    Inches(4.7), Inches(4.75), Inches(8.3), Inches(2.6),
    RGBColor(0x00, 0x5F, 0x73), RGBColor(0x00, 0x5F, 0x73), item_size=11)

# Auscultation image
img_on_slide(s, 1, Inches(0.3), Inches(6.6), Inches(4.2), Inches(0.8))

# ═════════════════════════════════════════════════════════════════════════════
# SLIDE 5 — CARDIOVASCULAR: INSPECTION + PERIPHERAL SIGNS
# ═════════════════════════════════════════════════════════════════════════════
s = prs.slides.add_slide(BLANK)
section_header(s, "Cardiovascular System — Inspection & Peripheral Signs",
               "Fuster & Hurst's The Heart, 15th Ed.", RED)

# Left col
colored_bullet_box(s, "👁 General Inspection",
    ["Breathlessness at rest / on exertion",
     "Central cyanosis — lips, tongue (R→L shunts, severe cardiorespiratory failure)",
     "Pallor — anaemia contributing to CCF",
     "Malar flush (bilateral reddish-cyanotic cheeks) — mitral stenosis",
     "Xanthelasmata / corneal arcus — hyperlipidaemia, CAD risk",
     "Syndromic features: Marfan (tall, arachnodactyly), Turner, Down, Noonan"],
    Inches(0.3), Inches(1.65), Inches(5.5), Inches(2.5), RED, RED, item_size=11)

colored_bullet_box(s, "✋ Hands & Peripheral Signs",
    ["Clubbing → cyanotic CHD, infective endocarditis",
     "Splinter haemorrhages → infective endocarditis (distal = often traumatic)",
     "Osler's nodes (painful) → IE — immune complex deposition",
     "Janeway lesions (painless) → IE — septic emboli",
     "Peripheral cyanosis → Raynaud's, PVD, low output states",
     "Koilonychia (spoon nails) → iron deficiency → CCF risk factor"],
    Inches(0.3), Inches(4.3), Inches(5.5), Inches(2.4), RGBColor(0x8B, 0x00, 0x00), RGBColor(0x8B, 0x00, 0x00), item_size=11)

# JVP image + description
img_on_slide(s, 2, Inches(6.0), Inches(1.65), Inches(4.0), Inches(2.8))
add_rect(s, Inches(6.0), Inches(4.45), Inches(4.0), Inches(0.32), fill=RED)
add_text(s, "Fig 3. JVP assessment: patient at 45°, head rotated left, IJV pulsation marked",
         Inches(6.05), Inches(4.47), Inches(3.9), Inches(0.28), size=9, color=WHITE, italic=True)

# JVP table
add_text(s, "Jugular Venous Pressure (JVP) — Key Points",
         Inches(6.0), Inches(4.85), Inches(7.1), Inches(0.3),
         size=13, bold=True, color=DARK_BLUE)
table_slide(s,
    ["Feature", "Details"],
    [["Normal", "< 3 cm above sternal angle at 45°"],
     ["Elevated JVP", "CCF, SVCO, TR, pericardial effusion, constrictive pericarditis"],
     ["Kussmaul's sign", "JVP rises on inspiration → constrictive pericarditis, RV failure"],
     ["Waveforms", "a = atrial contraction; c = tricuspid closure; v = venous filling"],
     ["Cannon a-waves", "Complete heart block (AV dissociation)"]],
    Inches(6.0), Inches(5.18), Inches(7.1), Inches(2.1),
    RED, RGBColor(0xFF, 0xEE, 0xEE))

# ═════════════════════════════════════════════════════════════════════════════
# SLIDE 6 — CARDIOVASCULAR: PULSE, PALPATION & AUSCULTATION
# ═════════════════════════════════════════════════════════════════════════════
s = prs.slides.add_slide(BLANK)
section_header(s, "Cardiovascular System — Pulse, Palpation & Auscultation",
               "Stepwise approach from Fuster & Hurst's The Heart, 15th Ed.", RED)

# Pulse characters table
add_text(s, "Pulse Characters & Their Clinical Significance",
         Inches(0.3), Inches(1.65), Inches(7.5), Inches(0.32),
         size=14, bold=True, color=DARK_BLUE)
table_slide(s,
    ["Pulse Character", "Cause"],
    [["Slow-rising, low-amplitude", "Aortic stenosis"],
     ["Collapsing / water-hammer", "Aortic regurgitation, PDA, thyrotoxicosis, fever"],
     ["Bisferiens (double peak)", "Mixed AS + AR, HOCM"],
     ["Pulsus alternans", "Severe LV failure"],
     ["Pulsus paradoxus (>10 mmHg)", "Cardiac tamponade, severe asthma"],
     ["Pulsus parvus et tardus", "Aortic stenosis (small and slow)"],
     ["Radial-femoral delay", "Coarctation of aorta"]],
    Inches(0.3), Inches(2.0), Inches(6.5), Inches(2.8),
    RED, RGBColor(0xFF, 0xF0, 0xF0))

# Palpation
colored_bullet_box(s, "✋ Precordial Palpation",
    ["Apex beat — normally 5th ICS, MCL; displaced = LV enlargement",
     "Heaving apex — pressure overload (AS, HTN)",
     "Tapping apex — palpable S1 in mitral stenosis",
     "Parasternal heave (left) — RV hypertrophy/enlargement",
     "Thrills — palpable murmurs (grade 4+); systolic thrill at base = AS/PS"],
    Inches(0.3), Inches(4.95), Inches(6.5), Inches(2.4), RED, RED, item_size=11)

# Auscultation areas
add_text(s, "🔊 Auscultation Areas",
         Inches(7.0), Inches(1.65), Inches(6.0), Inches(0.32),
         size=14, bold=True, color=DARK_BLUE)
table_slide(s,
    ["Area", "Location", "Best Hears"],
    [["Aortic (A2)", "2nd ICS, right sternal border", "Aortic valve sounds"],
     ["Pulmonary (P2)", "2nd ICS, left sternal border", "Pulmonary valve, S2 split"],
     ["Tricuspid (T)", "Lower left sternal border", "Tricuspid murmurs"],
     ["Mitral (M)", "Apex (5th ICS, MCL)", "Mitral murmurs"],
     ["Erb's Point", "3rd ICS, left sternal border", "AR diastolic murmur"]],
    Inches(7.0), Inches(2.0), Inches(6.1), Inches(2.2),
    RED, RGBColor(0xFF, 0xF0, 0xF0))

colored_bullet_box(s, "Heart Sounds & Murmurs",
    ["S1 (lub) — MV + TV closure; loud in MS, soft in MR/AS",
     "S2 (dub) — AV + PV closure; split widens on inspiration",
     "Fixed split S2 — ASD",
     "S3 (ventricular gallop) — CCF, MR, VSD (bell at apex)",
     "S4 (atrial gallop) — stiff ventricle, HTN, HOCM",
     "Pansystolic murmur — MR, TR, VSD",
     "Ejection systolic — AS, PS, flow murmur",
     "Early diastolic — AR (decrescendo), PR",
     "Mid-diastolic — MS (rumble at apex with bell, left lateral position)"],
    Inches(7.0), Inches(4.3), Inches(6.1), Inches(3.1),
    RGBColor(0x8B, 0x00, 0x00), RGBColor(0x8B, 0x00, 0x00), item_size=10)

# ═════════════════════════════════════════════════════════════════════════════
# SLIDE 7 — ABDOMINAL EXAMINATION: INSPECTION & AUSCULTATION
# ═════════════════════════════════════════════════════════════════════════════
s = prs.slides.add_slide(BLANK)
section_header(s, "Abdominal Examination — Inspection & Auscultation",
               "Bailey & Love's Short Practice of Surgery, 28th Ed.", GREEN)

# Patient position
add_rect(s, Inches(0.3), Inches(1.65), Inches(12.7), Inches(0.55),
         fill=LIGHT_GREEN, line=GREEN, line_w=Pt(1.5))
add_text(s, "Patient Position:  Lying flat, arms by sides, hips/knees extended (pillow if needed). Expose from xiphisternum → inguinal ligaments."
            "  For palpation: flex hips & knees to relax abdominal wall muscles.",
         Inches(0.5), Inches(1.68), Inches(12.3), Inches(0.48),
         size=12, bold=False, color=GREEN)

# Inspection left col
colored_bullet_box(s, "👁 Inspection — End of Bed & Close Inspection",
    ["Body habitus: cachectic (malignancy/malabsorption), obese",
     "Skin: jaundice, spider naevi (≥5 = liver disease), caput medusae (portal HTN)",
     "Scars: laparotomy, laparoscopic ports, stoma sites",
     "Distension: 5 Fs — Fat, Fluid, Flatus, Faeces, Foetus (+ Filthy big tumour)",
     "Visible peristalsis — pyloric stenosis (gastric), SBO",
     "Pulsatile epigastric mass — abdominal aortic aneurysm",
     "Dilated veins (caput medusae) — flow away from umbilicus",
     "Stoma — ileostomy (spout, RIF), colostomy (flush, LIF)",
     "Hernias — umbilical, incisional, inguinal (ask to cough)"],
    Inches(0.3), Inches(2.3), Inches(6.0), Inches(4.1), GREEN, GREEN, item_size=11)

# Right side: special signs + image
img_on_slide(s, 4, Inches(6.5), Inches(2.3), Inches(4.0), Inches(2.7))
add_rect(s, Inches(6.5), Inches(5.0), Inches(4.0), Inches(0.32), fill=GREEN)
add_text(s, "Fig 4. Hepatosplenomegaly with skin markings — EBV infectious mononucleosis",
         Inches(6.55), Inches(5.02), Inches(3.9), Inches(0.28), size=9, color=WHITE, italic=True)

colored_bullet_box(s, "⚠️ Emergency Abdominal Signs",
    ["Grey Turner's sign — flank bruising → retroperitoneal haemorrhage (pancreatitis, AAA)",
     "Cullen's sign — periumbilical bruising → intra-abdominal bleed (pancreatitis, ruptured ectopic)",
     "Visible peristalsis with distension → mechanical obstruction"],
    Inches(6.5), Inches(5.4), Inches(6.5), Inches(1.15),
    RED, RED, item_size=11, title_size=13)

colored_bullet_box(s, "🔊 Auscultation (Before Palpation!)",
    ["Normal bowel sounds: intermittent gurgles q5–15 sec",
     "Absent (>2 min silence): paralytic ileus, peritonitis, post-op",
     "Tinkling / high-pitched rushes: mechanical bowel obstruction",
     "Renal bruit (paraumbilical): renal artery stenosis",
     "Aortic bruit (midline): AAA or atherosclerosis",
     "Hepatic bruit: hepatocellular carcinoma, alcoholic hepatitis"],
    Inches(0.3), Inches(6.45), Inches(6.0), Inches(1.0),
    RGBColor(0x00, 0x6B, 0x3C), RGBColor(0x00, 0x6B, 0x3C), item_size=10, title_size=12)

# ═════════════════════════════════════════════════════════════════════════════
# SLIDE 8 — ABDOMINAL EXAMINATION: PALPATION & PERCUSSION
# ═════════════════════════════════════════════════════════════════════════════
s = prs.slides.add_slide(BLANK)
section_header(s, "Abdominal Examination — Palpation & Percussion",
               "Bailey & Love's Short Practice of Surgery, 28th Ed.", GREEN)

# Light palpation
colored_bullet_box(s, "✋ Light Palpation",
    ["Warm hands; watch face, not hands",
     "Start in the RIF (away from pain); 9 regions systematically",
     "Tenderness — site, severity (1–10)",
     "Guarding — voluntary (muscle tensing) vs involuntary (peritonism)",
     "Rebound tenderness — pain worse on release → peritoneal irritation",
     "Rigidity — board-like = generalised peritonitis"],
    Inches(0.3), Inches(1.65), Inches(4.5), Inches(2.4), GREEN, GREEN, item_size=11)

# Deep palpation
colored_bullet_box(s, "✋ Deep Palpation — Organomegaly",
    ["Liver: start RIF, move toward RUQ on inspiration; measure cm below costal margin",
     "Spleen: start RIF, move toward LUQ; left lateral decubitus position if needed",
     "Kidneys: bimanual ballottement, lower poles (right lower than left)",
     "Aorta: pulsatile, expansile midline mass → AAA",
     "Bladder: suprapubic dull mass → retention",
     "Murphy's sign: arrest of inspiration on palpating gallbladder → acute cholecystitis"],
    Inches(0.3), Inches(4.15), Inches(4.5), Inches(2.6), RGBColor(0x00, 0x6B, 0x3C),
    RGBColor(0x00, 0x6B, 0x3C), item_size=11)

# Percussion
colored_bullet_box(s, "🥁 Percussion",
    ["Liver span: 6–12 cm (dull); increased = hepatomegaly",
     "Traube's space (L): tympanic normally; dull = splenomegaly",
     "Shifting dullness: >1.5 L ascites needed; dullness shifts with position",
     "Fluid thrill: large ascites; tap one flank, feel thrill on other",
     "Suprapubic dullness: full bladder, ovarian cyst, gravid uterus"],
    Inches(0.3), Inches(6.85), Inches(4.5), Inches(0.55),
    TEAL, TEAL, item_size=9, title_size=11)

# Mass characteristics table
add_text(s, "Palpable Mass — Descriptors to Record",
         Inches(5.0), Inches(1.65), Inches(8.1), Inches(0.3),
         size=13, bold=True, color=DARK_BLUE)
table_slide(s,
    ["Feature", "Options"],
    [["Site", "Which region? (RUQ, LUQ, RIF, LIF, epigastric, umbilical, suprapubic, flanks)"],
     ["Size & Shape", "Measure in cm; oval, round, irregular"],
     ["Surface", "Smooth (simple cyst, kidney), irregular/nodular (malignancy, hydatid)"],
     ["Consistency", "Soft, firm, hard (malignancy, fibrosis), fluctuant (cystic/abscess)"],
     ["Tenderness", "Tender (inflammatory/ischaemic), non-tender (malignancy often)"],
     ["Mobility", "Mobile (benign), fixed (malignancy, retroperitoneal)"],
     ["Pulsatility", "Transmitted (anterior mass) vs expansile (AAA)"],
     ["Transillumination", "Lights up = cystic (lipoma, hydrocele, ovarian cyst)"]],
    Inches(5.0), Inches(2.0), Inches(8.1), Inches(3.3),
    GREEN, LIGHT_GREEN)

# Hepatosplenomegaly causes
add_text(s, "Causes of Hepatosplenomegaly",
         Inches(5.0), Inches(5.4), Inches(8.1), Inches(0.3),
         size=13, bold=True, color=DARK_BLUE)
table_slide(s,
    ["Hepatomegaly Causes", "Splenomegaly Causes"],
    [["Viral hepatitis (A,B,C,E), EBV, CMV", "Portal hypertension (cirrhosis, Budd-Chiari)"],
     ["Cirrhosis (early), fatty liver (NAFLD)", "Haematological: lymphoma, CML, thalassaemia"],
     ["CCF (congestive hepatomegaly)", "Infection: malaria, kala-azar, EBV, typhoid"],
     ["Metastases, HCC, liver abscess", "Autoimmune: RA (Felty's), SLE, sarcoidosis"]],
    Inches(5.0), Inches(5.75), Inches(8.1), Inches(1.65),
    GREEN, LIGHT_GREEN)

# ═════════════════════════════════════════════════════════════════════════════
# SLIDE 9 — NEUROLOGICAL EXAMINATION: OVERVIEW & CRANIAL NERVES
# ═════════════════════════════════════════════════════════════════════════════
s = prs.slides.add_slide(BLANK)
section_header(s, "Neurological Examination — Overview & Cranial Nerves",
               "Neuroanatomy Through Clinical Cases, 3rd Ed.", PURPLE)

# Sequence box
add_rect(s, Inches(0.3), Inches(1.65), Inches(12.7), Inches(0.45),
         fill=LIGHT_PURPLE, line=PURPLE, line_w=Pt(1.5))
add_text(s, "Neurological Exam Sequence:  Mental State  →  Cranial Nerves I–XII  →  Motor  →  Sensation  →  Reflexes  →  Coordination  →  Gait",
         Inches(0.5), Inches(1.68), Inches(12.3), Inches(0.4),
         size=13, bold=True, color=PURPLE, align=PP_ALIGN.CENTER)

# Cranial nerves table
add_text(s, "Cranial Nerves — Function & Test",
         Inches(0.3), Inches(2.2), Inches(8.5), Inches(0.32),
         size=14, bold=True, color=DARK_BLUE)
table_slide(s,
    ["CN", "Name", "Function", "Bedside Test"],
    [["I", "Olfactory", "Smell", "Identify coffee/vanilla (each nostril)"],
     ["II", "Optic", "Vision", "Acuity, fields, RAPD, fundoscopy"],
     ["III/IV/VI", "Oculomotor/Trochlear/Abducens", "Eye movements, pupil", "H-pattern, pupil reactions"],
     ["V", "Trigeminal", "Facial sensation, jaw", "Light touch 3 divisions; jaw jerk"],
     ["VII", "Facial", "Facial muscles", "Raise brows, close eyes, show teeth"],
     ["VIII", "Vestibulocochlear", "Hearing, balance", "Rinne, Weber; watch for nystagmus"],
     ["IX/X", "Glossopharyngeal/Vagus", "Palate, gag, speech", "Say 'Ahh'; palate rise symmetrical"],
     ["XI", "Accessory", "SCM, trapezius", "Head turn against resistance"],
     ["XII", "Hypoglossal", "Tongue", "Protrude tongue — deviates to side of lesion"]],
    Inches(0.3), Inches(2.55), Inches(8.5), Inches(4.0),
    PURPLE, LIGHT_PURPLE)

# Mental state column
colored_bullet_box(s, "🧠 Mental State Examination",
    ["Consciousness: GCS (E+V+M, max 15)",
     "Orientation: time, place, person",
     "Registration & recall (3-object memory)",
     "Attention (serial 7s, WORLD backwards)",
     "Language: fluency, naming, comprehension, repetition",
     "MMSE (<24/30) or MoCA (<26/30) for formal screening",
     "Affect and mood assessment"],
    Inches(8.9), Inches(1.65), Inches(4.1), Inches(3.4), PURPLE, PURPLE, item_size=11)

# HEENT diagram
colored_bullet_box(s, "⚠️ Signs of Meningism",
    ["Neck stiffness — resistance to passive flexion",
     "Kernig's sign — flex hip 90°, extend knee → pain/resistance",
     "Brudzinski's sign — flex neck → hips flex involuntarily",
     "Causes: bacterial meningitis, SAH, meningeal carcinomatosis"],
    Inches(8.9), Inches(5.15), Inches(4.1), Inches(2.15), RED, RED, item_size=11)

# ═════════════════════════════════════════════════════════════════════════════
# SLIDE 10 — NEUROLOGICAL: MOTOR, REFLEXES & COORDINATION
# ═════════════════════════════════════════════════════════════════════════════
s = prs.slides.add_slide(BLANK)
section_header(s, "Neurological Examination — Motor, Reflexes & Coordination",
               "Adams & Victor's Principles of Neurology, 12th Ed.", PURPLE)

# Motor table
add_text(s, "Motor Examination", Inches(0.3), Inches(1.65), Inches(6.0), Inches(0.3),
         size=14, bold=True, color=DARK_BLUE)
table_slide(s,
    ["Component", "Method", "Findings"],
    [["Tone", "Passive flexion/extension of joints", "Spasticity (UMN), rigidity (extrapyramidal), flaccidity (LMN)"],
     ["Power", "MRC 0–5 scale against resistance", "Proximal (myopathy), distal (neuropathy), pattern (UMN vs LMN)"],
     ["Bulk", "Visual & tactile assessment", "Wasting (LMN/disuse/myopathy), hypertrophy (Duchenne pseudohypertrophy)"],
     ["Involuntary movements", "Observation at rest & action", "Tremor, fasciculations, chorea, athetosis, ballismus, myoclonus"]],
    Inches(0.3), Inches(2.0), Inches(6.0), Inches(2.2),
    PURPLE, LIGHT_PURPLE)

# Reflexes table
add_text(s, "Deep Tendon Reflexes", Inches(0.3), Inches(4.3), Inches(6.0), Inches(0.3),
         size=14, bold=True, color=DARK_BLUE)
table_slide(s,
    ["Reflex", "Root", "Grading"],
    [["Biceps", "C5, C6", "0 = absent; 1+ = diminished; 2+ = normal"],
     ["Supinator (brachioradialis)", "C6", "3+ = brisk; 4+ = clonus"],
     ["Triceps", "C7", "Decreased = LMN / peripheral neuropathy"],
     ["Knee (patellar)", "L3, L4", "Increased = UMN lesion above that segment"],
     ["Ankle (Achilles)", "S1", "Reinforcement (Jendrassik) if absent initially"]],
    Inches(0.3), Inches(4.65), Inches(6.0), Inches(2.1),
    PURPLE, LIGHT_PURPLE)

# Reflex image
img_on_slide(s, 5, Inches(6.5), Inches(1.65), Inches(3.3), Inches(2.3))
add_rect(s, Inches(6.5), Inches(3.95), Inches(3.3), Inches(0.3), fill=PURPLE)
add_text(s, "Fig 5. Knee jerk (L3–L4) with Jendrassik manoeuvre",
         Inches(6.55), Inches(3.97), Inches(3.2), Inches(0.28), size=9, color=WHITE, italic=True)

# Babinski image
img_on_slide(s, 6, Inches(9.9), Inches(1.65), Inches(3.1), Inches(2.3))
add_rect(s, Inches(9.9), Inches(3.95), Inches(3.1), Inches(0.3), fill=PURPLE)
add_text(s, "Fig 6. Babinski sign — upgoing plantar = UMN lesion",
         Inches(9.95), Inches(3.97), Inches(3.0), Inches(0.28), size=9, color=WHITE, italic=True)

# UMN vs LMN
add_text(s, "UMN vs LMN — Distinguishing Features",
         Inches(6.5), Inches(4.35), Inches(6.5), Inches(0.3),
         size=13, bold=True, color=DARK_BLUE)
table_slide(s,
    ["Feature", "UMN Lesion", "LMN Lesion"],
    [["Tone", "Increased (spasticity)", "Decreased (flaccid)"],
     ["Power", "Decreased (pyramidal distribution)", "Decreased (at level of lesion)"],
     ["Reflexes", "Brisk / clonus", "Absent / diminished"],
     ["Plantar", "Upgoing (Babinski +ve)", "Downgoing / absent"],
     ["Wasting", "Mild (disuse)", "Marked (denervation)"],
     ["Fasciculations", "Absent", "Present"]],
    Inches(6.5), Inches(4.68), Inches(6.5), Inches(2.65),
    PURPLE, LIGHT_PURPLE)

# ═════════════════════════════════════════════════════════════════════════════
# SLIDE 11 — NEUROLOGICAL: SENSATION, COORDINATION & GAIT
# ═════════════════════════════════════════════════════════════════════════════
s = prs.slides.add_slide(BLANK)
section_header(s, "Neurological Examination — Sensation, Coordination & Gait",
               "Neuroanatomy Through Clinical Cases, 3rd Ed.", PURPLE)

# Sensation
colored_bullet_box(s, "🖐 Sensory Examination",
    ["Light touch — cotton wool; test each dermatome systematically",
     "Pinprick (pain) — Neurotip; distal→proximal to find level",
     "Temperature — cold tuning fork or hot/cold tubes",
     "Vibration — 128 Hz tuning fork; start distally (great toe → malleolus → knee)",
     "Proprioception (joint position sense) — up/down movement of distal phalanx",
     "Two-point discrimination — fingertip normal ≤5 mm; dorsal hand ≤20 mm",
     "Graphaesthesia — number drawn on palm (cortical/parietal lobe function)",
     "Stereognosis — identify object by touch alone (cortical function)"],
    Inches(0.3), Inches(1.65), Inches(5.8), Inches(3.5), PURPLE, PURPLE, item_size=11)

# Sensory loss patterns
add_text(s, "Sensory Loss Patterns", Inches(0.3), Inches(5.25), Inches(5.8), Inches(0.3),
         size=13, bold=True, color=DARK_BLUE)
table_slide(s,
    ["Pattern", "Lesion Level"],
    [["Glove & stocking", "Peripheral neuropathy (diabetes, B12, alcohol)"],
     ["Hemibody loss", "Thalamus, internal capsule, cortex"],
     ["Level (sensory level)", "Spinal cord lesion — below level affected"],
     ["Dissociated (pain/temp)", "Spinothalamic — hemisection (Brown-Séquard)"],
     ["Dermatomal", "Root (radiculopathy) or ganglion (herpes zoster)"]],
    Inches(0.3), Inches(5.58), Inches(5.8), Inches(1.85),
    PURPLE, LIGHT_PURPLE)

# Coordination
colored_bullet_box(s, "🎯 Coordination (Cerebellar Function)",
    ["Finger-nose test — dysmetria (overshoot), intention tremor",
     "Heel-shin test — ataxic, unable to run heel smoothly",
     "Rapid alternating movements — dysdiadochokinesia",
     "Romberg test — eyes closed: sways = posterior column / vestibular disease",
     "DANISH mnemonic: Dysdiadochokinesia, Ataxia, Nystagmus, Intention tremor, Slurred speech (dysarthria), Hypotonia"],
    Inches(6.2), Inches(1.65), Inches(6.9), Inches(2.8), TEAL, TEAL, item_size=11)

# Gait types
add_text(s, "Gait Abnormalities & Their Causes",
         Inches(6.2), Inches(4.55), Inches(6.9), Inches(0.3),
         size=14, bold=True, color=DARK_BLUE)
table_slide(s,
    ["Gait Type", "Features", "Cause"],
    [["Hemiplegic", "Arm flexed, leg circumducts", "Contralateral UMN (stroke)"],
     ["Scissor", "Stiff crossing legs", "Bilateral UMN (CP, MS)"],
     ["Steppage", "High-lift, foot slap", "Foot drop (L4/5, peroneal N.)"],
     ["Ataxic / broad-based", "Wide base, unstable", "Cerebellar disease"],
     ["Parkinsonian", "Shuffling, festinant, reduced arm swing, stooped", "Parkinson's / Parkinsonism"],
     ["Apraxic", "'Stuck to floor', wide base", "Frontal lobe, NPH"],
     ["Antalgic", "Limp, reduced stance phase", "Pain (osteoarthritis, fracture)"]],
    Inches(6.2), Inches(4.88), Inches(6.9), Inches(2.55),
    PURPLE, LIGHT_PURPLE)

# ═════════════════════════════════════════════════════════════════════════════
# SLIDE 12 — MUSCULOSKELETAL EXAMINATION
# ═════════════════════════════════════════════════════════════════════════════
s = prs.slides.add_slide(BLANK)
section_header(s, "Musculoskeletal Examination",
               "Rheumatology, 2-Volume Set (2022, Elsevier)", ORANGE)

# GALS screen
colored_bullet_box(s, "🦴 GALS Screen (Gait, Arms, Legs, Spine)",
    ["Ask 3 screening questions: any pain/stiffness? any swelling? any difficulty with stairs/dressing?",
     "GAIT — observe walking: symmetry, stride, arm swing, turning",
     "ARMS — hands outstretched (deformity, wasting); make fist; touch each finger to thumb",
     "LEGS — squat; inspect knees; passive ROM of hip (flexion, internal rotation)",
     "SPINE — lateral flexion of cervical spine; lumbar forward flexion (finger-floor distance)"],
    Inches(0.3), Inches(1.65), Inches(5.8), Inches(2.6), ORANGE, ORANGE, item_size=11)

# Joint examination sequence
colored_bullet_box(s, "🔄 Joint Examination — LOOK, FEEL, MOVE",
    ["LOOK: deformity, swelling, erythema, muscle wasting, scars, psoriatic plaques",
     "FEEL: warmth (dorsum of hand), tenderness (site — joint line vs peri-articular), crepitus, effusion (patellar tap, bulge sign)",
     "MOVE (Active first, then Passive): record ROM in degrees; note pain, instability, end-feel",
     "SPECIAL TESTS: Lachman (ACL), McMurray (meniscus), Finkelstein (De Quervain's), Phalen's (CTS)"],
    Inches(0.3), Inches(4.4), Inches(5.8), Inches(2.0), RGBColor(0xC0, 0x50, 0x00),
    RGBColor(0xC0, 0x50, 0x00), item_size=11)

# Hand in RA and OA
add_text(s, "Hand Deformity Patterns",
         Inches(0.3), Inches(6.5), Inches(5.8), Inches(0.3),
         size=13, bold=True, color=DARK_BLUE)
table_slide(s,
    ["Deformity", "Condition"],
    [["Ulnar deviation + MCP swelling", "Rheumatoid arthritis"],
     ["Swan-neck / Boutonnière deformity", "Rheumatoid arthritis"],
     ["Heberden's (DIP) + Bouchard's (PIP) nodes", "Osteoarthritis"],
     ["Tophaceous nodules (chalk-white)", "Chronic tophaceous gout"]],
    Inches(0.3), Inches(6.85), Inches(5.8), Inches(0.58),
    ORANGE, LIGHT_ORANGE)

# Systemic signs of rheumatological disease
add_text(s, "Systemic Rheumatological Signs",
         Inches(6.2), Inches(1.65), Inches(6.9), Inches(0.3),
         size=14, bold=True, color=DARK_BLUE)
table_slide(s,
    ["System", "Sign", "Condition"],
    [["Skin", "Butterfly rash, Gottron's papules, sclerodactyly", "SLE, DM/PM, SSc"],
     ["Eyes", "Dry eyes/mouth (sicca), episcleritis, uveitis", "Sjögren's, RA, AS"],
     ["Nails", "Pitting, onycholysis, nail-fold infarcts", "Psoriatic arthritis, SSc"],
     ["Lungs", "Fibrosis, pleuritis, effusion", "RA, SLE, SSc, PM"],
     ["Kidneys", "Proteinuria, haematuria, HTN", "SLE nephritis, vasculitis"],
     ["Heart", "Pericarditis, Libman-Sacks endocarditis", "SLE, RA"],
     ["Neurology", "Mononeuritis multiplex, CNS vasculitis", "RA, SLE, PAN"]],
    Inches(6.2), Inches(2.0), Inches(6.9), Inches(3.1),
    ORANGE, LIGHT_ORANGE)

# Spine
colored_bullet_box(s, "🔲 Spine Examination",
    ["Cervical: range of motion (flexion, extension, lateral flexion, rotation); Spurling's test (foraminal compression)",
     "Thoracic: kyphosis (osteoporosis, ankylosing spondylitis), scoliosis, local tenderness",
     "Lumbar: Schober's test (AS — mark L4-S1, 10 cm up; should expand to ≥15 cm on forward flexion)",
     "SLR (straight leg raise) → <70° with sciatica = L4/5/S1 radiculopathy",
     "Femoral stretch test → anterior thigh pain = L2/3/4 radiculopathy"],
    Inches(6.2), Inches(5.2), Inches(6.9), Inches(2.2), RGBColor(0xC0, 0x50, 0x00),
    RGBColor(0xC0, 0x50, 0x00), item_size=11)

# ═════════════════════════════════════════════════════════════════════════════
# SLIDE 13 — SKIN & ABDOMINAL SIGNS WITH REAL IMAGES
# ═════════════════════════════════════════════════════════════════════════════
s = prs.slides.add_slide(BLANK)
section_header(s, "Key Clinical Signs — Dermatological & Abdominal",
               "Fitzpatrick's Dermatology · Bailey & Love's Surgery", RGBColor(0x7B, 0x3F, 0x00))

HDR = RGBColor(0x7B, 0x3F, 0x00)
LGHT = RGBColor(0xFD, 0xF3, 0xE7)

# Real images row
img_on_slide(s, 7, Inches(0.3), Inches(1.65), Inches(4.0), Inches(2.7))
add_rect(s, Inches(0.3), Inches(4.35), Inches(4.0), Inches(0.32), fill=HDR)
add_text(s, "Fig 7. Scleral icterus (bilirubin >35 µmol/L) — before & after treatment",
         Inches(0.35), Inches(4.37), Inches(3.9), Inches(0.28), size=9, color=WHITE, italic=True)

img_on_slide(s, 8, Inches(4.5), Inches(1.65), Inches(4.5), Inches(2.7))
add_rect(s, Inches(4.5), Inches(4.35), Inches(4.5), Inches(0.32), fill=HDR)
add_text(s, "Fig 8. Multiple stigmata of chronic liver disease: icterus, gynecomastia, spider naevi, prurigo nodularis, xanthelasma",
         Inches(4.55), Inches(4.37), Inches(4.4), Inches(0.28), size=9, color=WHITE, italic=True)

img_on_slide(s, 9, Inches(9.2), Inches(1.65), Inches(3.9), Inches(2.7))
add_rect(s, Inches(9.2), Inches(4.35), Inches(3.9), Inches(0.32), fill=HDR)
add_text(s, "Fig 9. Cardiac auscultation — supine position with stethoscope diaphragm on precordium",
         Inches(9.25), Inches(4.37), Inches(3.8), Inches(0.28), size=9, color=WHITE, italic=True)

# Jaundice classification
add_text(s, "Jaundice — Classification & Causes",
         Inches(0.3), Inches(4.8), Inches(6.0), Inches(0.3),
         size=13, bold=True, color=DARK_BLUE)
table_slide(s,
    ["Type", "Bilirubin", "Causes"],
    [["Pre-hepatic", "Unconjugated ↑", "Haemolysis (sickle cell, spherocytosis, G6PD, malaria)"],
     ["Hepatic", "Both ↑", "Viral hepatitis, alcoholic hepatitis, cirrhosis, drugs"],
     ["Post-hepatic", "Conjugated ↑", "Gallstones, cholangiocarcinoma, pancreatic head Ca, PSC"]],
    Inches(0.3), Inches(5.13), Inches(6.0), Inches(1.4),
    HDR, LGHT)

# Liver disease signs
add_text(s, "Stigmata of Chronic Liver Disease",
         Inches(6.5), Inches(4.8), Inches(6.5), Inches(0.3),
         size=13, bold=True, color=DARK_BLUE)
table_slide(s,
    ["Sign", "Location", "Significance"],
    [["Spider naevi (>5)", "SVC distribution — face, arms, trunk", "Oestrogen excess — CLD"],
     ["Palmar erythema", "Thenar/hypothenar mottling", "CLD, pregnancy, RA"],
     ["Leukonychia", "White nails", "Hypoalbuminaemia"],
     ["Dupuytren's contracture", "Palmar fascia fibrosis", "Alcoholic CLD"],
     ["Gynaecomastia", "Male breast tissue", "Oestrogen excess"],
     ["Caput medusae", "Dilated periumbilical veins", "Portal hypertension"],
     ["Ascites", "Abdominal distension + shifting dullness", "Portal HTN + hypoalbuminaemia"],
     ["Fetor hepaticus", "Sweet-musty breath", "Severe hepatic failure"]],
    Inches(6.5), Inches(5.13), Inches(6.5), Inches(2.3),
    HDR, LGHT)

# ═════════════════════════════════════════════════════════════════════════════
# SLIDE 14 — DIFFERENTIAL DIAGNOSIS FLOWCHART
# ═════════════════════════════════════════════════════════════════════════════
s = prs.slides.add_slide(BLANK)
section_header(s, "Clinical Reasoning — Differential Diagnosis Framework",
               "Goldman-Cecil Medicine, 26th Ed.", DARK_BLUE)

add_text(s, "VITAMIN C(D) Mnemonic for Neurological DDx",
         Inches(0.3), Inches(1.65), Inches(6.5), Inches(0.32),
         size=14, bold=True, color=DARK_BLUE)
vitamin_items = [
    ("V — Vascular", "Stroke, TIA, haemorrhage, vasculitis, venous sinus thrombosis", MID_BLUE),
    ("I — Infectious", "Meningitis, encephalitis, abscess, HIV, PML, neurosyphilis, prions", TEAL),
    ("T — Toxic/Traumatic", "Head injury, drugs, alcohol, CO poisoning, metabolic encephalopathy", ORANGE),
    ("A — Autoimmune", "MS, NMO, anti-NMDAR encephalitis, Guillain-Barré, MG, vasculitis", PURPLE),
    ("M — Metabolic", "Hypoglycaemia, uraemia, hepatic failure, thyroid/adrenal, electrolytes", GREEN),
    ("I — Idiopathic", "Epilepsy, Parkinson's disease, essential tremor, functional neurological disorder", MID_BLUE),
    ("N — Neoplastic", "Primary tumour, metastases, paraneoplastic syndromes, meningeal carcinomatosis", RED),
    ("C — Congenital", "Malformations, NF1/2, TSC, Sturge-Weber syndrome", RGBColor(0x5A, 0x5A, 0xAA)),
    ("D — Degenerative", "Alzheimer's, FTD, MND, Huntington's, MSA, PSP, DLB", RGBColor(0x7B, 0x3F, 0x00)),
]
for i, (cat, detail, col) in enumerate(vitamin_items):
    row = i % 3
    col_n = i // 3
    bx = Inches(0.3) + col_n * Inches(4.4)
    by = Inches(2.1) + row * Inches(1.4)
    add_rect(s, bx, by, Inches(4.1), Inches(0.38), fill=col)
    add_text(s, cat, bx + Inches(0.1), by + Inches(0.04),
             Inches(3.9), Inches(0.3), size=13, bold=True, color=WHITE)
    add_rect(s, bx, by + Inches(0.38), Inches(4.1), Inches(1.0),
             fill=WHITE, line=col, line_w=Pt(1))
    add_text(s, detail, bx + Inches(0.1), by + Inches(0.42),
             Inches(3.9), Inches(0.95), size=10, color=DARK_GRAY)

# Assessment structure
add_text(s, "Structured Assessment & Plan",
         Inches(13.5 * 0.69), Inches(1.65), Inches(4.1), Inches(0.32),
         size=14, bold=True, color=DARK_BLUE)
steps_plan = [
    ("1. Summary\nFormulation", "1–2 sentence summary of age, key features, likely diagnosis", DARK_BLUE),
    ("2. Differential\nDiagnosis", "List in order of probability; consider common > rare; dangerous > benign", MID_BLUE),
    ("3. Investigations", "Bloods, imaging, special tests — justify each investigation", TEAL),
    ("4. Management", "Problem-based: medications, procedures, referrals, monitoring", GREEN),
    ("5. Patient\nEducation", "Explain diagnosis, prognosis, lifestyle, follow-up", ORANGE),
]
for i, (title, detail, col) in enumerate(steps_plan):
    by = Inches(2.1) + i * Inches(0.97)
    flow_box(s, title, Inches(9.25), by, Inches(1.6), Inches(0.75), col)
    add_rect(s, Inches(10.85), by, Inches(2.3), Inches(0.75),
             fill=WHITE, line=col, line_w=Pt(0.8))
    add_text(s, detail, Inches(10.95), by + Inches(0.05),
             Inches(2.1), Inches(0.65), size=9, color=DARK_GRAY)

# ═════════════════════════════════════════════════════════════════════════════
# SLIDE 15 — REFERENCES & KEY CLINICAL PEARLS
# ═════════════════════════════════════════════════════════════════════════════
s = prs.slides.add_slide(BLANK)
section_header(s, "Key Clinical Pearls & References", "", DARK_BLUE)

pearls = [
    ("👁", "Always expose the patient properly — never examine through clothing. Observation begins the moment you see the patient.", MID_BLUE),
    ("💬", "History gives the diagnosis in 70–80% of cases. Invest time in it — the examination confirms it.", TEAL),
    ("🫁", "Respiratory rate is the most sensitive early sign of deterioration. Count it for a full 60 seconds.", GREEN),
    ("❤️", "Shaking hands gives 5 pieces of information simultaneously: tone, temperature, peripheral perfusion, pulse, and bilateral BP asymmetry.", RED),
    ("🫃", "In abdominal examination, AUSCULTATE before palpating — palpation stimulates bowel sounds artificially.", ORANGE),
    ("🧠", "In neurology, always localise before aetiologising — where is the lesion? Then: what is the lesion?", PURPLE),
    ("⚠️", "Grey Turner's + Cullen's signs = retroperitoneal/intra-abdominal haemorrhage. Virchow's node = intra-abdominal malignancy. Never miss them.", RGBColor(0xC0, 0x20, 0x20)),
    ("🦴", "In MSK: LOOK, FEEL, MOVE — in that order. Always compare with the contralateral side.", ORANGE),
    ("📝", "Document BOTH positive findings AND pertinent negatives — both contribute to the clinical picture and medicolegal record.", DARK_BLUE),
    ("🌡️", "The most important vital sign is what the patient looks like. General appearance guides urgency more than any single number. — Goldman-Cecil Medicine", MID_BLUE),
]
for i, (icon, pearl, col) in enumerate(pearls):
    row = i % 5
    col_n = i // 5
    bx = Inches(0.3) + col_n * Inches(6.4)
    by = Inches(1.65) + row * Inches(1.07)
    add_rect(s, bx, by, Inches(0.45), Inches(0.9), fill=col)
    add_text(s, icon, bx, by + Inches(0.18), Inches(0.45), Inches(0.5),
             size=18, align=PP_ALIGN.CENTER, color=WHITE)
    add_rect(s, bx + Inches(0.45), by, Inches(5.7), Inches(0.9),
             fill=WHITE, line=col, line_w=Pt(0.8))
    add_text(s, pearl, bx + Inches(0.55), by + Inches(0.05),
             Inches(5.5), Inches(0.82), size=11, color=DARK_GRAY)

# References
add_rect(s, Inches(0.3), Inches(7.1), Inches(12.7), Inches(0.32),
         fill=DARK_BLUE)
refs = "Sources: Goldman-Cecil Medicine 26e  ·  Fuster & Hurst's The Heart 15e  ·  Bailey & Love's Surgery 28e  ·  S. Das Manual on Clinical Surgery 13e  ·  Neuroanatomy Through Clinical Cases 3e  ·  Rheumatology 2022 Elsevier"
add_text(s, refs, Inches(0.4), Inches(7.12), Inches(12.5), Inches(0.28),
         size=8, color=RGBColor(0xC8, 0xDC, 0xEF), italic=True, align=PP_ALIGN.CENTER)

# ── save ──────────────────────────────────────────────────────────────────────
OUT = "/tmp/workspace/systemic-exam-ppt/Systemic_Examination_of_Patient.pptx"
prs.save(OUT)
print(f"Saved: {OUT}")
import os
print(f"Size: {os.path.getsize(OUT)//1024} KB  |  Slides: 15")
Running Command

cd /tmp/workspace/systemic-exam-ppt && python build_ppt.py 2>&1

Editing File

~/systemic-exam-ppt/build_ppt.py

Successfully replaced 1 instance(s) of the string in '/tmp/workspace/systemic-exam-ppt/build_ppt.py'
Running Command

cd /tmp/workspace/systemic-exam-ppt && python build_ppt.py 2>&1

Your PPT is ready! Here is the download link:

Systemic Examination of Patient

Presentation · PPTX


433 KB · 15 slides — here's what's inside:
SlideContent
1Title slide — colour-coded system icons (Respiratory, CVS, Abdominal, Neurological, MSK)
2Overview flowchart — 9-step examination sequence with IPPA reminder + abdominal exception
3Respiratory: Inspection — checklist, breathing pattern types, + real photo of bilateral digital clubbing with grading table
4Respiratory: Palpation, Percussion & Auscultation — percussion notes table, real CXR of consolidation + effusion, breath sounds guide
5CVS: Inspection & Peripheral Signs — general inspection, hand signs (Osler, Janeway, splinters), real JVP photo, JVP waveform table
6CVS: Pulse, Palpation & Auscultation — pulse character table, precordial palpation, auscultation areas, heart sounds & murmurs
7Abdominal: Inspection & Auscultation — 5 F's of distension, Grey Turner's/Cullen's signs, real photo of hepatosplenomegaly, bowel sounds guide
8Abdominal: Palpation & Percussion — mass descriptors table, hepatomegaly vs splenomegaly causes
9Neurological: Overview & Cranial Nerves — all CN I–XII with bedside tests, mental state exam, signs of meningism
10Neurological: Motor & Reflexes — motor exam table, DTR table, UMN vs LMN comparison, real reflex hammer photo, real Babinski sign photo
11Neurological: Sensation, Coordination & Gait — sensory loss patterns, DANISH mnemonic, 7 gait types table
12Musculoskeletal — GALS screen, LOOK/FEEL/MOVE, hand deformities, systemic rheumatological signs, spine exam
13Clinical Signs with Real Images — scleral icterus (before/after), 9 stigmata of CLD, jaundice classification table
14Differential Diagnosis Flowchart — VITAMIN C(D) mnemonic (9 colour-coded boxes), structured Assessment & Plan
15Key Clinical Pearls & References — 10 colour-coded pearls, full source citations

Generate a clinical examination checklist as a Word document (printable A4 form for students)

Reading File
Good — I have everything I need. Building the Word document now.
Running Command

mkdir -p /tmp/workspace/clinical-checklist && cat > /tmp/workspace/clinical-checklist/build_checklist.py << 'PYEOF' from docx import Document from docx.shared import Pt, Inches, RGBColor, Cm from docx.enum.text import WD_ALIGN_PARAGRAPH from docx.enum.table import WD_ALIGN_VERTICAL, WD_TABLE_ALIGNMENT from docx.oxml.ns import qn from docx.oxml import OxmlElement import copy OUT = "/tmp/workspace/clinical-checklist/Clinical_Examination_Checklist.docx" # ── Colour palette ───────────────────────────────────────────────────────── C_DARK_BLUE = RGBColor(0x1A, 0x3A, 0x5C) C_MID_BLUE = RGBColor(0x2E, 0x6D, 0xA4) C_TEAL = RGBColor(0x00, 0x7B, 0x83) C_GREEN = RGBColor(0x1E, 0x7A, 0x3E) C_ORANGE = RGBColor(0xC0, 0x60, 0x00) C_RED = RGBColor(0xA0, 0x10, 0x10) C_PURPLE = RGBColor(0x5B, 0x2D, 0x8E) C_GOLD = RGBColor(0xE8, 0xA0, 0x20) C_WHITE = RGBColor(0xFF, 0xFF, 0xFF) C_LIGHT_GRAY = RGBColor(0xF2, 0xF2, 0xF2) C_DARK_GRAY = RGBColor(0x33, 0x33, 0x33) C_MED_GRAY = RGBColor(0x99, 0x99, 0x99) # ── Hex shading helper ───────────────────────────────────────────────────── def hex_color(r, g, b): return f"{r:02X}{g:02X}{b:02X}" def shade_cell(cell, r, g, b): tc = cell._tc tcPr = tc.get_or_add_tcPr() shd = OxmlElement('w:shd') shd.set(qn('w:val'), 'clear') shd.set(qn('w:color'), 'auto') shd.set(qn('w:fill'), hex_color(r, g, b)) tcPr.append(shd) def set_cell_border(cell, **kwargs): tc = cell._tc tcPr = tc.get_or_add_tcPr() tcBorders = OxmlElement('w:tcBorders') for edge in ('top', 'bottom', 'left', 'right', 'insideH', 'insideV'): if edge in kwargs: border = OxmlElement(f'w:{edge}') border.set(qn('w:val'), kwargs[edge].get('val', 'single')) border.set(qn('w:sz'), str(kwargs[edge].get('sz', 6))) border.set(qn('w:color'), kwargs[edge].get('color', '000000')) tcBorders.append(border) tcPr.append(tcBorders) def set_para_spacing(para, before=0, after=0, line=None): pPr = para._p.get_or_add_pPr() spacing = OxmlElement('w:spacing') spacing.set(qn('w:before'), str(before)) spacing.set(qn('w:after'), str(after)) if line: spacing.set(qn('w:line'), str(line)) spacing.set(qn('w:lineRule'), 'auto') pPr.append(spacing) def keep_with_next(para): pPr = para._p.get_or_add_pPr() kwn = OxmlElement('w:keepNext') pPr.append(kwn) def page_break_before(para): pPr = para._p.get_or_add_pPr() pb = OxmlElement('w:pageBreakBefore') pPr.append(pb) # ── Document setup ───────────────────────────────────────────────────────── doc = Document() # A4 page margins section = doc.sections[0] section.page_width = Cm(21.0) section.page_height = Cm(29.7) section.top_margin = Cm(1.5) section.bottom_margin = Cm(1.5) section.left_margin = Cm(2.0) section.right_margin = Cm(2.0) # Normal style ns = doc.styles['Normal'] ns.font.name = 'Arial' ns.font.size = Pt(9) ns.paragraph_format.space_before = Pt(0) ns.paragraph_format.space_after = Pt(0) # ── Helpers ──────────────────────────────────────────────────────────────── def h_run(para, text, size=9, bold=False, italic=False, color=None): run = para.add_run(text) run.font.name = 'Arial' run.font.size = Pt(size) run.font.bold = bold run.font.italic = italic if color: run.font.color.rgb = color return run def add_para(doc_or_cell, text='', size=9, bold=False, italic=False, color=None, align=WD_ALIGN_PARAGRAPH.LEFT, before=0, after=0, left_indent=0): if hasattr(doc_or_cell, 'add_paragraph'): p = doc_or_cell.add_paragraph() else: p = doc_or_cell.paragraphs[0] p.alignment = align set_para_spacing(p, before=before, after=after) if left_indent: p.paragraph_format.left_indent = Pt(left_indent) if text: h_run(p, text, size=size, bold=bold, italic=italic, color=color) return p def section_heading(doc, title, color_rgb, icon=''): tbl = doc.add_table(rows=1, cols=1) tbl.alignment = WD_TABLE_ALIGNMENT.LEFT tbl.style = 'Table Grid' cell = tbl.rows[0].cells[0] shade_cell(cell, color_rgb.red, color_rgb.green, color_rgb.blue) cell.width = Inches(6.69) p = cell.paragraphs[0] p.alignment = WD_ALIGN_PARAGRAPH.LEFT set_para_spacing(p, before=60, after=60) cell._tc.get_or_add_tcPr() h_run(p, f' {icon} {title}' if icon else f' {title}', size=11, bold=True, color=C_WHITE) # remove table borders for row in tbl.rows: for c in row.cells: set_cell_border(c, top={'val':'nil'}, bottom={'val':'nil'}, left={'val':'nil'}, right={'val':'nil'}) sp = doc.add_paragraph() set_para_spacing(sp, before=20, after=20) return tbl def checkbox_row(table, row_idx, label, note='', bg_alt=False): """Single checklist row with checkbox cell, label, and notes cell""" row = table.rows[row_idx] # Cell 0 — checkbox c0 = row.cells[0] shade_cell(c0, 0xF8, 0xF8, 0xF8) if not bg_alt else shade_cell(c0, 0xEE, 0xF5, 0xFF) p0 = c0.paragraphs[0] p0.alignment = WD_ALIGN_PARAGRAPH.CENTER set_para_spacing(p0, before=30, after=30) h_run(p0, '☐', size=11, color=C_MID_BLUE) # Cell 1 — label c1 = row.cells[1] shade_cell(c1, 0xFF, 0xFF, 0xFF) if not bg_alt else shade_cell(c1, 0xF5, 0xF9, 0xFF) p1 = c1.paragraphs[0] p1.alignment = WD_ALIGN_PARAGRAPH.LEFT set_para_spacing(p1, before=25, after=25) p1.paragraph_format.left_indent = Pt(4) h_run(p1, label, size=9, color=C_DARK_GRAY) # Cell 2 — notes line c2 = row.cells[2] shade_cell(c2, 0xFF, 0xFF, 0xFF) if not bg_alt else shade_cell(c2, 0xF5, 0xF9, 0xFF) p2 = c2.paragraphs[0] p2.alignment = WD_ALIGN_PARAGRAPH.LEFT set_para_spacing(p2, before=25, after=25) if note: h_run(p2, note, size=8, italic=True, color=C_MED_GRAY) else: h_run(p2, '________________________________', size=8, color=RGBColor(0xCC, 0xCC, 0xCC)) def make_checklist_table(doc, items): """items = list of (label, note) tuples""" tbl = doc.add_table(rows=len(items), cols=3) tbl.style = 'Table Grid' tbl.alignment = WD_TABLE_ALIGNMENT.LEFT # column widths for row in tbl.rows: row.cells[0].width = Cm(0.8) row.cells[1].width = Cm(8.5) row.cells[2].width = Cm(7.6) for i, (label, note) in enumerate(items): checkbox_row(tbl, i, label, note, bg_alt=(i % 2 == 0)) for c in tbl.rows[i].cells: set_cell_border(c, top={'val':'single','sz':2,'color':'DDDDDD'}, bottom={'val':'single','sz':2,'color':'DDDDDD'}, left={'val':'nil'}, right={'val':'nil'}) sp = doc.add_paragraph() set_para_spacing(sp, before=20, after=20) def sub_header(doc, text, color_rgb): tbl = doc.add_table(rows=1, cols=1) tbl.style = 'Table Grid' cell = tbl.rows[0].cells[0] shade_cell(cell, color_rgb.red, color_rgb.green, color_rgb.blue) p = cell.paragraphs[0] set_para_spacing(p, before=40, after=40) h_run(p, f' {text}', size=10, bold=True, color=C_WHITE) for c in tbl.rows[0].cells: set_cell_border(c, top={'val':'nil'}, bottom={'val':'nil'}, left={'val':'nil'}, right={'val':'nil'}) sp = doc.add_paragraph() set_para_spacing(sp, before=15, after=15) def field_row(doc, label, width_label=3.5, width_field=13.2): """Single-line fill-in field""" tbl = doc.add_table(rows=1, cols=2) tbl.style = 'Table Grid' tbl.rows[0].cells[0].width = Cm(width_label) tbl.rows[0].cells[1].width = Cm(width_field) c0 = tbl.rows[0].cells[0] c1 = tbl.rows[0].cells[1] shade_cell(c0, 0xE8, 0xF0, 0xFE) p0 = c0.paragraphs[0] set_para_spacing(p0, before=40, after=40) h_run(p0, f' {label}', size=9, bold=True, color=C_DARK_BLUE) p1 = c1.paragraphs[0] set_para_spacing(p1, before=40, after=40) for c in [c0, c1]: set_cell_border(c, top={'val':'single','sz':4,'color':'AAAAAA'}, bottom={'val':'single','sz':4,'color':'AAAAAA'}, left={'val':'nil'}, right={'val':'nil'}) sp = doc.add_paragraph() set_para_spacing(sp, before=8, after=8) def divider(doc): p = doc.add_paragraph() set_para_spacing(p, before=10, after=10) pPr = p._p.get_or_add_pPr() pBdr = OxmlElement('w:pBdr') bottom = OxmlElement('w:bottom') bottom.set(qn('w:val'), 'single') bottom.set(qn('w:sz'), '6') bottom.set(qn('w:color'), '2E6DA4') pBdr.append(bottom) pPr.append(pBdr) def score_table(doc, headers, rows): ncols = len(headers) tbl = doc.add_table(rows=len(rows)+1, cols=ncols) tbl.style = 'Table Grid' # header for ci, h in enumerate(headers): c = tbl.rows[0].cells[ci] shade_cell(c, 0x1A, 0x3A, 0x5C) p = c.paragraphs[0] p.alignment = WD_ALIGN_PARAGRAPH.CENTER set_para_spacing(p, before=40, after=40) h_run(p, h, size=9, bold=True, color=C_WHITE) # rows for ri, row in enumerate(rows): bg = (0xF2, 0xF7, 0xFF) if ri % 2 == 0 else (0xFF, 0xFF, 0xFF) for ci, val in enumerate(row): c = tbl.rows[ri+1].cells[ci] shade_cell(c, *bg) p = c.paragraphs[0] p.alignment = WD_ALIGN_PARAGRAPH.CENTER set_para_spacing(p, before=30, after=30) h_run(p, val, size=9, color=C_DARK_GRAY) for row in tbl.rows: for c in row.cells: set_cell_border(c, top={'val':'single','sz':4,'color':'AAAAAA'}, bottom={'val':'single','sz':4,'color':'AAAAAA'}, left={'val':'single','sz':2,'color':'DDDDDD'}, right={'val':'single','sz':2,'color':'DDDDDD'}) sp = doc.add_paragraph() set_para_spacing(sp, before=20, after=20) # ══════════════════════════════════════════════════════════════════════════════ # PAGE 1 — HEADER & PATIENT DETAILS # ══════════════════════════════════════════════════════════════════════════════ # Title banner tbl = doc.add_table(rows=2, cols=1) tbl.style = 'Table Grid' shade_cell(tbl.rows[0].cells[0], 0x1A, 0x3A, 0x5C) shade_cell(tbl.rows[1].cells[0], 0x2E, 0x6D, 0xA4) p1 = tbl.rows[0].cells[0].paragraphs[0] set_para_spacing(p1, before=100, after=40) p1.alignment = WD_ALIGN_PARAGRAPH.CENTER h_run(p1, 'CLINICAL EXAMINATION CHECKLIST', size=16, bold=True, color=C_WHITE) p2 = tbl.rows[1].cells[0].paragraphs[0] set_para_spacing(p2, before=40, after=80) p2.alignment = WD_ALIGN_PARAGRAPH.CENTER h_run(p2, 'Systemic Examination of the Patient | Student Clinical Skills Assessment Form', size=10, italic=True, color=RGBColor(0xC8, 0xDC, 0xEF)) for r in tbl.rows: for c in r.cells: set_cell_border(c, top={'val':'nil'}, bottom={'val':'nil'}, left={'val':'nil'}, right={'val':'nil'}) sp = doc.add_paragraph(); set_para_spacing(sp, before=30, after=30) # Patient details — 2-column layout details_tbl = doc.add_table(rows=3, cols=4) details_tbl.style = 'Table Grid' labels = ['Patient Name:', 'Age / Sex:', 'Date:', 'Examiner:', 'Ward / Clinic:', 'Case No.:', 'Diagnosis (if known):', 'Score:'] for ri in range(3): for ci in range(4): idx = ri * 4 + ci if idx >= len(labels): break cell = details_tbl.rows[ri].cells[ci] p = cell.paragraphs[0] set_para_spacing(p, before=50, after=50) p.paragraph_format.left_indent = Pt(4) if ci % 2 == 0: shade_cell(cell, 0xD6, 0xE8, 0xF7) h_run(p, f' {labels[idx]}', size=9, bold=True, color=C_DARK_BLUE) else: shade_cell(cell, 0xFF, 0xFF, 0xFF) for edge in ['top','bottom','left','right']: set_cell_border(cell, **{edge: {'val':'single','sz':4,'color':'AAAAAA'}}) sp = doc.add_paragraph(); set_para_spacing(sp, before=20, after=20) divider(doc) sp = doc.add_paragraph(); set_para_spacing(sp, before=8, after=8) # Instructions inst_tbl = doc.add_table(rows=1, cols=1) inst_tbl.style = 'Table Grid' shade_cell(inst_tbl.rows[0].cells[0], 0xFF, 0xF8, 0xE1) p_inst = inst_tbl.rows[0].cells[0].paragraphs[0] set_para_spacing(p_inst, before=60, after=60) h_run(p_inst, '📋 INSTRUCTIONS: ', size=9, bold=True, color=C_ORANGE) h_run(p_inst, 'Tick (✓) each item as completed. Record findings in the Notes column. Items marked ', size=9, color=C_DARK_GRAY) h_run(p_inst, '★', size=9, bold=True, color=C_RED) h_run(p_inst, ' are mandatory. Score each section out of the maximum shown. Total score: /100', size=9, color=C_DARK_GRAY) for c in inst_tbl.rows[0].cells: set_cell_border(c, top={'val':'single','sz':6,'color':'E8A020'}, bottom={'val':'single','sz':6,'color':'E8A020'}, left={'val':'single','sz':6,'color':'E8A020'}, right={'val':'single','sz':6,'color':'E8A020'}) sp = doc.add_paragraph(); set_para_spacing(sp, before=20, after=20) # ══════════════════════════════════════════════════════════════════════════════ # SECTION 1: GENERAL EXAMINATION # ══════════════════════════════════════════════════════════════════════════════ section_heading(doc, 'SECTION 1 — GENERAL EXAMINATION & VITAL SIGNS', C_DARK_BLUE, '1') sub_header(doc, '1A. General Appearance (End-of-Bed Assessment)', C_MID_BLUE) make_checklist_table(doc, [ ('★ Introduced self, washed hands, obtained consent', 'Professionalism — mandatory first step'), ('★ Adequate exposure with patient comfort & dignity', 'Chaperone offered if appropriate'), ('★ General appearance — well/unwell, in distress?', ''), ('Level of consciousness (AVPU / GCS)', 'E__ V__ M__ = GCS __/15'), ('Nutritional status — cachectic / obese / normal', 'BMI estimate: _____ kg/m²'), ('Skin colour — pale / jaundiced / cyanosed / flushed', ''), ('Body posture — upright / tripod / lying still / writhing', ''), ('Dysmorphic or syndromic features', 'e.g. Marfan, Down, Turner, Cushing'), ('Assistive devices (oxygen, wheelchair, aids)', ''), ]) sub_header(doc, '1B. Vital Signs', C_MID_BLUE) make_checklist_table(doc, [ ('★ Temperature', 'Oral / rectal / axillary / tympanic: ______ °C'), ('★ Pulse rate', 'Rate: ______ bpm Rhythm: Regular / Irregular'), ('★ Blood pressure (both arms)', 'R: ______/______ L: ______/______ mmHg'), ('★ Respiratory rate (60 seconds)', '______ breaths/min (Normal 12–20)'), ('★ Oxygen saturation (SpO₂)', '______% on air / ______ L/min O₂'), ('Height & Weight → BMI', 'Ht: ____m Wt: ____kg BMI: ______kg/m²'), ('Postural BP if indicated', 'Lying: ______ Standing: ______'), ]) sp = doc.add_paragraph(); set_para_spacing(sp, before=10, after=10) # Section 1 score box sc_tbl = doc.add_table(rows=1, cols=3) sc_tbl.style = 'Table Grid' shade_cell(sc_tbl.rows[0].cells[0], 0x1A, 0x3A, 0x5C) shade_cell(sc_tbl.rows[0].cells[1], 0xF2, 0xF2, 0xF2) shade_cell(sc_tbl.rows[0].cells[2], 0xD6, 0xE8, 0xF7) for i, txt in enumerate(['Section 1 Score', 'Comments:', ' / 15']): p = sc_tbl.rows[0].cells[i].paragraphs[0] set_para_spacing(p, before=50, after=50) p.alignment = WD_ALIGN_PARAGRAPH.CENTER h_run(p, txt, size=9, bold=(i != 1), color=C_WHITE if i == 0 else C_DARK_GRAY) for c in sc_tbl.rows[0].cells: set_cell_border(c, top={'val':'nil'}, bottom={'val':'nil'}, left={'val':'nil'}, right={'val':'nil'}) sp = doc.add_paragraph(); set_para_spacing(sp, before=20, after=20) divider(doc) # ══════════════════════════════════════════════════════════════════════════════ # SECTION 2: RESPIRATORY SYSTEM # ══════════════════════════════════════════════════════════════════════════════ sp = doc.add_paragraph(); set_para_spacing(sp, before=20, after=20) section_heading(doc, 'SECTION 2 — RESPIRATORY SYSTEM', C_TEAL, '2') sub_header(doc, '2A. Inspection', C_TEAL) make_checklist_table(doc, [ ('★ Respiratory rate, rhythm, depth', 'Rate: ______/min Regular / Irregular'), ('Chest shape (barrel, pectus)', 'Normal / Barrel / Pigeon / Funnel / Kyphoscoliosis'), ('Chest wall asymmetry (one side moves less)', 'L = R / L < R / R < L'), ('Use of accessory muscles', 'None / SCM / Scalenes / Intercostal recession'), ('Tracheal position', 'Central / Deviated — side: ______'), ('Surgical scars / chest drains', 'Location: ______________________'), ('Pursed-lip breathing / nasal flaring', ''), ('Cyanosis — peripheral / central', 'Peripheral: Y/N Central (tongue): Y/N'), ('Clubbing of fingers', 'Absent / Present — Grade: ______'), ]) sub_header(doc, '2B. Palpation', C_TEAL) make_checklist_table(doc, [ ('★ Chest expansion (lower chest)', 'Normal ≥5 cm R: ____cm L: ____cm'), ('Tactile vocal fremitus (say "99")', 'Normal / Increased (consolidation) / Decreased (effusion/PTx)'), ('Position of apex beat', 'ICS: ____ Line: ____ (Normally 5th ICS MCL)'), ('Tracheal tug (severe COPD)', 'Absent / Present'), ]) sub_header(doc, '2C. Percussion', C_TEAL) make_checklist_table(doc, [ ('★ Systematic percussion — anterior & posterior', ''), ('Upper zones (bilateral)', 'R: Resonant/Dull/Hyper L: Resonant/Dull/Hyper'), ('Mid zones (bilateral)', 'R: ______________ L: ______________'), ('Lower zones / bases (bilateral)', 'R: ______________ L: ______________'), ('Liver dullness (right side)', 'Present — spans ____cm / Absent'), ('Shifting dullness (for effusion)', 'Absent / Present — side: ______'), ]) sub_header(doc, '2D. Auscultation', C_TEAL) make_checklist_table(doc, [ ('★ Breath sounds — all zones bilaterally', 'Vesicular / Bronchial / Diminished / Absent'), ('Vocal resonance (say "99")', 'Normal / Increased / Decreased / Whispering pec.'), ('Added sounds — crackles', 'Absent / Fine (end-insp) / Coarse Zones: ______'), ('Added sounds — wheeze', 'Absent / Expiratory / Inspiratory / Both Fixed: Y/N'), ('Pleural rub', 'Absent / Present Site: ______'), ]) sp = doc.add_paragraph(); set_para_spacing(sp, before=10, after=10) sc_tbl2 = doc.add_table(rows=1, cols=3) sc_tbl2.style = 'Table Grid' shade_cell(sc_tbl2.rows[0].cells[0], 0x00, 0x7B, 0x83) shade_cell(sc_tbl2.rows[0].cells[1], 0xF2, 0xF2, 0xF2) shade_cell(sc_tbl2.rows[0].cells[2], 0xD0, 0xF0, 0xF4) for i, txt in enumerate(['Section 2 Score', 'Comments / Findings:', ' / 15']): p = sc_tbl2.rows[0].cells[i].paragraphs[0] set_para_spacing(p, before=50, after=50) p.alignment = WD_ALIGN_PARAGRAPH.CENTER h_run(p, txt, size=9, bold=(i != 1), color=C_WHITE if i == 0 else C_DARK_GRAY) for c in sc_tbl2.rows[0].cells: set_cell_border(c, top={'val':'nil'}, bottom={'val':'nil'}, left={'val':'nil'}, right={'val':'nil'}) sp = doc.add_paragraph(); set_para_spacing(sp, before=20, after=20) divider(doc) # ══════════════════════════════════════════════════════════════════════════════ # SECTION 3: CARDIOVASCULAR SYSTEM # ══════════════════════════════════════════════════════════════════════════════ sp = doc.add_paragraph(); set_para_spacing(sp, before=20, after=20) section_heading(doc, 'SECTION 3 — CARDIOVASCULAR SYSTEM', C_RED, '3') sub_header(doc, '3A. Peripheral Signs & Hands', RGBColor(0xA0, 0x10, 0x10)) make_checklist_table(doc, [ ('★ Radial pulse — rate, rhythm, volume, character', 'Rate: ___ Rhythm: Reg/Irreg Vol: Normal/High/Low'), ('Radial-radial simultaneous (radio-femoral delay)', 'Synchronous: Y/N Delay: Y/N (coarctation)'), ('Clubbing / splinter haemorrhages / Osler nodes', 'Clubbing: Y/N Splinters: Y/N Osler: Y/N'), ('Janeway lesions / koilonychia / peripheral cyanosis', 'Janeway: Y/N Koilonychia: Y/N Cyanosis: Y/N'), ('Tendon xanthomata / palmar xanthomata', 'Absent / Present'), ('Peripheral oedema (ankles, sacrum)', 'Grade: 0 / 1+ / 2+ / 3+ / 4+ Pitting: Y/N'), ]) sub_header(doc, '3B. Face & Neck', RGBColor(0xA0, 0x10, 0x10)) make_checklist_table(doc, [ ('★ Jugular venous pressure (JVP) at 45°', 'Normal (<3 cm) / Elevated — ____cm above sternal angle'), ('JVP waveform character', 'Normal / Cannon a-waves / Giant v-waves'), ('Central cyanosis — lips, tongue', 'Absent / Present'), ('Malar flush', 'Absent / Present'), ('Corneal arcus / xanthelasmata', 'Arcus: Y/N Xanthelasma: Y/N'), ('Carotid pulse — rate, character, bruit', 'Character: Normal / Slow-rising / Collapsing Bruit: Y/N'), ]) sub_header(doc, '3C. Precordium — Inspection & Palpation', RGBColor(0xA0, 0x10, 0x10)) make_checklist_table(doc, [ ('★ Apex beat — position', 'ICS: ____ Line: MCL / AAL / Displaced laterally'), ('Apex beat — character', 'Normal / Heaving / Tapping / Thrusting / Diffuse'), ('Left parasternal heave', 'Absent / Present (RV hypertrophy)'), ('Thrills', 'Absent / Systolic / Diastolic Site: ______'), ('Precordial scars / pacemaker', 'Sternotomy: Y/N VATS: Y/N PPM bulge: Y/N'), ]) sub_header(doc, '3D. Auscultation', RGBColor(0xA0, 0x10, 0x10)) make_checklist_table(doc, [ ('★ S1 — quality', 'Normal / Loud (MS) / Soft (MR, AS, long PR) / Variable (AF, CHB)'), ('★ S2 — quality, splitting', 'Normal / Loud P2 (PH) / Soft A2 (AS) / Splitting: Y/N'), ('S3 (ventricular gallop — bell at apex)', 'Absent / Present (CCF, MR, VSD)'), ('S4 (atrial gallop)', 'Absent / Present (HTN, HOCM, AS)'), ('Murmurs — systolic', 'Ejection systolic / Pansystolic / Late systolic Grade: __/6'), ('Murmurs — diastolic', 'Early diastolic / Mid-diastolic / Continuous Grade: __/6'), ('Murmur radiation', 'Axilla (MR) / Neck (AS) / Left sternal edge (AR)'), ('Lung bases for crackles (LVF)', 'Clear / Fine crackles — bilateral / unilateral'), ]) sp = doc.add_paragraph(); set_para_spacing(sp, before=10, after=10) sc_tbl3 = doc.add_table(rows=1, cols=3) sc_tbl3.style = 'Table Grid' shade_cell(sc_tbl3.rows[0].cells[0], 0xA0, 0x10, 0x10) shade_cell(sc_tbl3.rows[0].cells[1], 0xF2, 0xF2, 0xF2) shade_cell(sc_tbl3.rows[0].cells[2], 0xFF, 0xEE, 0xEE) for i, txt in enumerate(['Section 3 Score', 'Comments / Findings:', ' / 20']): p = sc_tbl3.rows[0].cells[i].paragraphs[0] set_para_spacing(p, before=50, after=50) p.alignment = WD_ALIGN_PARAGRAPH.CENTER h_run(p, txt, size=9, bold=(i != 1), color=C_WHITE if i == 0 else C_DARK_GRAY) for c in sc_tbl3.rows[0].cells: set_cell_border(c, top={'val':'nil'}, bottom={'val':'nil'}, left={'val':'nil'}, right={'val':'nil'}) sp = doc.add_paragraph(); set_para_spacing(sp, before=20, after=20) divider(doc) # ══════════════════════════════════════════════════════════════════════════════ # SECTION 4: ABDOMINAL / GASTROINTESTINAL SYSTEM # ══════════════════════════════════════════════════════════════════════════════ sp = doc.add_paragraph(); set_para_spacing(sp, before=20, after=20) section_heading(doc, 'SECTION 4 — ABDOMINAL / GASTROINTESTINAL SYSTEM', C_GREEN, '4') sub_header(doc, '4A. Inspection', C_GREEN) make_checklist_table(doc, [ ('★ Patient positioned flat, adequate exposure', 'Pillow if needed / Hips & knees extended initially'), ('Abdominal shape / contour', 'Flat / Scaphoid / Distended — 5 Fs: ______'), ('Visible peristalsis', 'Absent / Present (pyloric stenosis / SBO)'), ('Scars — location & likely operation', 'Describe: ______________________________'), ('Stoma (type, site, effluent)', 'Ileostomy (R, spout) / Colostomy (L, flush) / Urostomy'), ('Distended veins — caput medusae', 'Absent / Present — flow direction: ______'), ('Hernias — umbilical, inguinal, incisional', 'Cough impulse: Y/N Reducible: Y/N'), ('Spider naevi (≥5), jaundice, striae', 'Spider naevi: __ Jaundice: Y/N Striae: Y/N'), ('Grey Turner / Cullen signs (if relevant)', 'Grey Turner: Y/N Cullen: Y/N'), ]) sub_header(doc, '4B. Auscultation (BEFORE palpation)', C_GREEN) make_checklist_table(doc, [ ('★ Bowel sounds (listen ≥2 minutes if absent)', 'Normal / Hyperactive / Reduced / Absent Tinkling: Y/N'), ('Arterial bruits — aortic, renal, iliac', 'Aortic bruit: Y/N Renal bruit: Y/N Site: ______'), ]) sub_header(doc, '4C. Palpation — Light', C_GREEN) make_checklist_table(doc, [ ('★ Light palpation — 9 regions systematically', 'Start away from pain; watch face'), ('Tenderness — site and severity', 'Site: ___________ Score: ___/10'), ('Guarding', 'Absent / Voluntary / Involuntary'), ('Rebound tenderness', 'Absent / Present Site: ______'), ('Rigidity (board-like)', 'Absent / Present → generalised peritonitis'), ("Murphy's sign (if RUQ tenderness)", 'Negative / Positive (acute cholecystitis)'), ("McBurney's point / Rovsing's sign", 'McBurney: Y/N Rovsing: Y/N'), ]) sub_header(doc, '4D. Palpation — Deep (Organomegaly)', C_GREEN) make_checklist_table(doc, [ ('★ Liver — size (cm below costal margin)', 'Not palpable / ____cm BCM Smooth / Nodular Tender: Y/N'), ('★ Spleen — size (Hackett grade)', 'Not palpable / Grade: __ Can I get above it: Y/N'), ('Kidneys — bimanual ballottement', 'R: Normal / Enlarged L: Normal / Enlarged'), ('Aorta — midline pulsatile / expansile mass', 'Width: ____cm Expansile: Y/N (AAA if >3cm)'), ('Bladder (suprapubic)', 'Palpable / Not palpable Size: ______'), ('Other masses — site, size, character', 'Describe: ______________________________'), ]) sub_header(doc, '4E. Percussion', C_GREEN) make_checklist_table(doc, [ ('★ Liver span', '____cm (Normal 6–12 cm)'), ("Traube's space (spleen)", 'Tympanic (normal) / Dull (splenomegaly)'), ('Shifting dullness (ascites)', 'Absent / Present — mark fluid level'), ('Fluid thrill (large ascites)', 'Absent / Present'), ('Bladder dullness', 'Absent / Present'), ]) sp = doc.add_paragraph(); set_para_spacing(sp, before=10, after=10) sc_tbl4 = doc.add_table(rows=1, cols=3) sc_tbl4.style = 'Table Grid' shade_cell(sc_tbl4.rows[0].cells[0], 0x1E, 0x7A, 0x3E) shade_cell(sc_tbl4.rows[0].cells[1], 0xF2, 0xF2, 0xF2) shade_cell(sc_tbl4.rows[0].cells[2], 0xD6, 0xF0, 0xE0) for i, txt in enumerate(['Section 4 Score', 'Comments / Findings:', ' / 20']): p = sc_tbl4.rows[0].cells[i].paragraphs[0] set_para_spacing(p, before=50, after=50) p.alignment = WD_ALIGN_PARAGRAPH.CENTER h_run(p, txt, size=9, bold=(i != 1), color=C_WHITE if i == 0 else C_DARK_GRAY) for c in sc_tbl4.rows[0].cells: set_cell_border(c, top={'val':'nil'}, bottom={'val':'nil'}, left={'val':'nil'}, right={'val':'nil'}) sp = doc.add_paragraph(); set_para_spacing(sp, before=20, after=20) divider(doc) # ══════════════════════════════════════════════════════════════════════════════ # SECTION 5: NEUROLOGICAL EXAMINATION # ══════════════════════════════════════════════════════════════════════════════ sp = doc.add_paragraph(); set_para_spacing(sp, before=20, after=20) section_heading(doc, 'SECTION 5 — NEUROLOGICAL EXAMINATION', C_PURPLE, '5') sub_header(doc, '5A. Mental State', C_PURPLE) make_checklist_table(doc, [ ('★ Level of consciousness (GCS)', 'E: __/4 V: __/5 M: __/6 Total: __/15'), ('Orientation — time, place, person', 'Time: Y/N Place: Y/N Person: Y/N'), ('Registration & recall (3 objects)', 'Registered: __/3 Recalled at 3 min: __/3'), ('Language — fluency, naming, comprehension', 'Fluent: Y/N Nominal aphasia: Y/N Comprehension: Y/N'), ('MMSE or MoCA (if cognitive concern)', 'Score: ____/30 (MMSE <24 / MoCA <26 = impaired)'), ]) sub_header(doc, '5B. Cranial Nerves', C_PURPLE) make_checklist_table(doc, [ ('CN I — Smell (each nostril)', 'Intact / Impaired Side: ______'), ('CN II — Visual acuity, fields, RAPD', 'VA: R ___ L ___ Fields: Full / Defect: ______'), ('CN III/IV/VI — Eye movements, pupils', 'PERLA: Y/N EOM: Full / Defect Size: R__mm L__mm'), ('CN V — Facial sensation (3 divisions), jaw', 'Sensation: Normal / Impaired Jaw jerk: Normal / Brisk'), ('CN VII — Facial muscles (UMN vs LMN pattern)', 'Normal / UMN (forehead spared) / LMN (full face)'), ('CN VIII — Hearing, Rinne & Weber', "Rinne: R BC>AC / AC>BC Weber: Central / Lateralises: ______"), ('CN IX/X — Palate rise, gag reflex', 'Palate rises symmetrically: Y/N Gag: Intact / Absent'), ('CN XI — Trapezius / SCM power', 'Normal / Weak Side: ______'), ('CN XII — Tongue protrusion', 'Midline / Deviates to: ______ Wasting / fasciculations: Y/N'), ]) sub_header(doc, '5C. Motor System', C_PURPLE) make_checklist_table(doc, [ ('★ Tone — upper limbs', 'Normal / Spastic (UMN) / Rigid (extrapyramidal) / Flaccid (LMN)'), ('★ Tone — lower limbs', 'Normal / Spastic / Rigid / Flaccid Clonus: Y/N'), ('★ Power — upper limbs (MRC 0–5)', 'Shoulder: __ Elbow F/E: __/__ Wrist F/E: __/__ Grip: __'), ('★ Power — lower limbs (MRC 0–5)', 'Hip F/E: __/__ Knee F/E: __/__ Ankle DF/PF: __/__'), ('Bulk / wasting / fasciculations', 'Normal / Wasting Site: ______ Fasciculations: Y/N'), ('Involuntary movements', 'None / Tremor (resting/intention/postural) / Chorea / Other'), ]) sub_header(doc, '5D. Reflexes & Coordination', C_PURPLE) make_checklist_table(doc, [ ('★ Biceps (C5/C6)', 'R: 0/1+/2+/3+/4+ L: 0/1+/2+/3+/4+'), ('★ Supinator/Triceps (C6/C7)', 'Supinator R: __ L: __ Triceps R: __ L: __'), ('★ Knee jerk (L3/L4)', 'R: 0/1+/2+/3+/4+ L: 0/1+/2+/3+/4+'), ('★ Ankle jerk (S1) + clonus', 'R: 0/1+/2+/3+/4+ L: 0/1+/2+/3+/4+ Clonus: Y/N'), ('★ Plantar response (Babinski)', 'R: Downgoing / Upgoing (UMN) / Absent L: ______'), ('Finger-nose test', 'Normal / Dysmetria / Intention tremor Side: ______'), ('Heel-shin test', 'Normal / Ataxic Side: ______'), ('Rapid alternating movements', 'Normal / Dysdiadochokinesia Side: ______'), ('Romberg test', 'Negative / Positive (falls when eyes closed)'), ]) sub_header(doc, '5E. Sensation & Gait', C_PURPLE) make_checklist_table(doc, [ ('Light touch (cotton wool) — dermatomal/pattern', 'Normal / Impaired Pattern: ______________________'), ('Pinprick — level/pattern', 'Normal / Impaired Level: ______________________'), ('Vibration (128 Hz tuning fork)', 'Intact at great toe: Y/N Level of loss: ______'), ('Joint position sense (proprioception)', 'Great toe: R Y/N L Y/N Level: ______'), ('★ Gait — observe walking & turning', 'Normal / Hemiplegic / Ataxic / Parkinsonian / Steppage / Other'), ('Signs of meningism (if indicated)', 'Neck stiffness: Y/N Kernig: Y/N Brudzinski: Y/N'), ]) sp = doc.add_paragraph(); set_para_spacing(sp, before=10, after=10) sc_tbl5 = doc.add_table(rows=1, cols=3) sc_tbl5.style = 'Table Grid' shade_cell(sc_tbl5.rows[0].cells[0], 0x5B, 0x2D, 0x8E) shade_cell(sc_tbl5.rows[0].cells[1], 0xF2, 0xF2, 0xF2) shade_cell(sc_tbl5.rows[0].cells[2], 0xEE, 0xE0, 0xFF) for i, txt in enumerate(['Section 5 Score', 'Comments / Findings:', ' / 20']): p = sc_tbl5.rows[0].cells[i].paragraphs[0] set_para_spacing(p, before=50, after=50) p.alignment = WD_ALIGN_PARAGRAPH.CENTER h_run(p, txt, size=9, bold=(i != 1), color=C_WHITE if i == 0 else C_DARK_GRAY) for c in sc_tbl5.rows[0].cells: set_cell_border(c, top={'val':'nil'}, bottom={'val':'nil'}, left={'val':'nil'}, right={'val':'nil'}) sp = doc.add_paragraph(); set_para_spacing(sp, before=20, after=20) divider(doc) # ══════════════════════════════════════════════════════════════════════════════ # SECTION 6: MUSCULOSKELETAL # ══════════════════════════════════════════════════════════════════════════════ sp = doc.add_paragraph(); set_para_spacing(sp, before=20, after=20) section_heading(doc, 'SECTION 6 — MUSCULOSKELETAL EXAMINATION', C_ORANGE, '6') sub_header(doc, '6A. GALS Screen', C_ORANGE) make_checklist_table(doc, [ ('Screening questions (pain, stiffness, swelling, ADLs)', 'Y/N answers recorded: ______________________'), ('Gait — observe walking, turning', 'Normal / Antalgic / Trendelenburg / Other: ______'), ('Arms — outstretched, fist, pinch', 'Normal / Deformity / Weakness / Restriction: ______'), ('Legs — squat, knee inspection', 'Normal / Limitation: ______'), ('Spine — cervical lateral flexion, lumbar flexion', 'Normal / Restricted Finger-floor: ____cm'), ]) sub_header(doc, '6B. Specific Joint Examination (LOOK → FEEL → MOVE)', C_ORANGE) make_checklist_table(doc, [ ('LOOK — deformity, swelling, erythema, wasting, scars', 'Joint examined: ______ Findings: ______'), ('FEEL — warmth (back of hand), tenderness, crepitus', 'Tender: Y/N Warm: Y/N Crepitus: Y/N'), ('Effusion — patellar tap / bulge sign (knee)', 'Absent / Present'), ('MOVE (Active) — range of motion (degrees)', 'Flexion: __° Extension: __° Other: ______'), ('MOVE (Passive) — compare with active', 'Equal / Passive > Active / Pain at extremes'), ('Contralateral comparison', 'Symmetric / Asymmetric: ______'), ]) sp = doc.add_paragraph(); set_para_spacing(sp, before=10, after=10) sc_tbl6 = doc.add_table(rows=1, cols=3) sc_tbl6.style = 'Table Grid' shade_cell(sc_tbl6.rows[0].cells[0], 0xC0, 0x60, 0x00) shade_cell(sc_tbl6.rows[0].cells[1], 0xF2, 0xF2, 0xF2) shade_cell(sc_tbl6.rows[0].cells[2], 0xFD, 0xEE, 0xD8) for i, txt in enumerate(['Section 6 Score', 'Comments / Findings:', ' / 10']): p = sc_tbl6.rows[0].cells[i].paragraphs[0] set_para_spacing(p, before=50, after=50) p.alignment = WD_ALIGN_PARAGRAPH.CENTER h_run(p, txt, size=9, bold=(i != 1), color=C_WHITE if i == 0 else C_DARK_GRAY) for c in sc_tbl6.rows[0].cells: set_cell_border(c, top={'val':'nil'}, bottom={'val':'nil'}, left={'val':'nil'}, right={'val':'nil'}) sp = doc.add_paragraph(); set_para_spacing(sp, before=20, after=20) divider(doc) # ══════════════════════════════════════════════════════════════════════════════ # FINAL SCORE TABLE + EXAMINER SIGN-OFF # ══════════════════════════════════════════════════════════════════════════════ sp = doc.add_paragraph(); set_para_spacing(sp, before=20, after=20) section_heading(doc, 'FINAL SCORE SUMMARY & EXAMINER SIGN-OFF', C_DARK_BLUE, '✓') score_table(doc, ['Section', 'Component', 'Max Score', 'Score Obtained', 'Comments'], [ ['1', 'General Examination & Vital Signs', '15', '', ''], ['2', 'Respiratory System', '15', '', ''], ['3', 'Cardiovascular System', '20', '', ''], ['4', 'Abdominal / GI System', '20', '', ''], ['5', 'Neurological Examination', '20', '', ''], ['6', 'Musculoskeletal', '10', '', ''], ['', 'TOTAL', '100', '', ''], ] ) # Grade descriptor table sp = doc.add_paragraph(); set_para_spacing(sp, before=15, after=15) grade_tbl = doc.add_table(rows=2, cols=6) grade_tbl.style = 'Table Grid' grades = [('≥75', 'Distinction', 0x1E, 0x7A, 0x3E), ('65–74', 'Merit', 0x2E, 0x6D, 0xA4), ('50–64', 'Pass', 0x00, 0x7B, 0x83), ('40–49', 'Borderline', 0xC0, 0x60, 0x00), ('<40', 'Fail', 0xA0, 0x10, 0x10), ('Score', 'Grade', 0x1A, 0x3A, 0x5C)] for ci, (score, label, r, g, b) in enumerate(grades): c0 = grade_tbl.rows[0].cells[ci] c1 = grade_tbl.rows[1].cells[ci] shade_cell(c0, r, g, b) shade_cell(c1, 0xF8, 0xF8, 0xF8) p0 = c0.paragraphs[0]; set_para_spacing(p0, before=30, after=30); p0.alignment = WD_ALIGN_PARAGRAPH.CENTER h_run(p0, score, size=9, bold=True, color=C_WHITE) p1 = c1.paragraphs[0]; set_para_spacing(p1, before=30, after=30); p1.alignment = WD_ALIGN_PARAGRAPH.CENTER h_run(p1, label, size=9, color=C_DARK_GRAY) for c in [c0, c1]: set_cell_border(c, top={'val':'nil'}, bottom={'val':'nil'}, left={'val':'nil'}, right={'val':'nil'}) sp = doc.add_paragraph(); set_para_spacing(sp, before=20, after=20) # Feedback & Sign-off fb_tbl = doc.add_table(rows=4, cols=2) fb_tbl.style = 'Table Grid' fb_rows = [ ('Strengths:', ''), ('Areas to Improve:', ''), ('Examiner Name & Signature:', ''), ('Date & Stamp:', ''), ] for ri, (lbl, val) in enumerate(fb_rows): bg_r = 0xD6 if ri % 2 == 0 else 0xFF bg_g = 0xE8 if ri % 2 == 0 else 0xFF bg_b = 0xF7 if ri % 2 == 0 else 0xFF c0 = fb_tbl.rows[ri].cells[0] c1 = fb_tbl.rows[ri].cells[1] c0.width = Cm(4.5); c1.width = Cm(12.3) shade_cell(c0, bg_r, bg_g, bg_b) p0 = c0.paragraphs[0] set_para_spacing(p0, before=60 if ri < 2 else 50, after=60 if ri < 2 else 50) h_run(p0, f' {lbl}', size=9, bold=True, color=C_DARK_BLUE) for c in [c0, c1]: set_cell_border(c, top={'val':'single','sz':4,'color':'AAAAAA'}, bottom={'val':'single','sz':4,'color':'AAAAAA'}, left={'val':'nil'}, right={'val':'nil'}) sp = doc.add_paragraph(); set_para_spacing(sp, before=20, after=20) # Footer footer_tbl = doc.add_table(rows=1, cols=1) footer_tbl.style = 'Table Grid' shade_cell(footer_tbl.rows[0].cells[0], 0x1A, 0x3A, 0x5C) p_f = footer_tbl.rows[0].cells[0].paragraphs[0] set_para_spacing(p_f, before=50, after=50) p_f.alignment = WD_ALIGN_PARAGRAPH.CENTER h_run(p_f, 'Sources: Goldman-Cecil Medicine 26e · Fuster & Hurst\'s The Heart 15e · Bailey & Love\'s Surgery 28e · Neuroanatomy Through Clinical Cases 3e · Rheumatology 2022 Elsevier', size=8, italic=True, color=RGBColor(0xC8, 0xDC, 0xEF)) for c in footer_tbl.rows[0].cells: set_cell_border(c, top={'val':'nil'}, bottom={'val':'nil'}, left={'val':'nil'}, right={'val':'nil'}) # ── Save ─────────────────────────────────────────────────────────────────── doc.save(OUT) import os print(f"Saved: {OUT}") print(f"Size: {os.path.getsize(OUT)//1024} KB") PYEOF echo "Script written."

Your credits are exhausted. You can purchase a top-up or subscribe to a plan to continue using Orris. If you're already subscribed, your daily credits will reset tomorrow.

?

Your credits are exhausted. You can purchase a top-up or subscribe to a plan to continue using Orris. If you're already subscribed, your daily credits will reset tomorrow.

Build the Word document checklist now

Your credits are exhausted. You can purchase a top-up or subscribe to a plan to continue using Orris. If you're already subscribed, your daily credits will reset tomorrow.
This is a shared conversation. Sign in to Orris to start your own chat.