MASTER LIST OF IMPORTANT CLASSIFICATIONS, SCORES, STAGING & PROTOCOLS (MS General Surgery University + NEET SS) 1. GENERAL SURGERY • Wound Classification (CDC) • Types of Wound Healing • Surgical Site Infection (CDC) • Clavien–Dindo Classification • Southampton Wound Grading • ASA Physical Status Classification • Ramsay Sedation Score • WHO Surgical Safety Checklist • Damage Control Surgery • ERAS Protocol • SIRS Criteria • qSOFA Score • SOFA Score • APACHE II Score • Charlson Comorbidity Index • ECOG Performance Status • Karnofsky Performance Scale 2. BURNS • Burn Depth (1st–4th Degree) • Jackson's Zones of Burn • Rule of Nines • Lund & Browder Chart • Parkland Formula • Modified Brooke Formula • ABSI Score • Baux Score • Burn Centre Referral Criteria 3. TRAUMA • ATLS Primary Survey • Glasgow Coma Scale (GCS) • Injury Severity Score (ISS) • Revised Trauma Score (RTS) • TRISS • Mangled Extremity Severity Score (MESS) • AAST Organ Injury Scale - Liver - Spleen - Kidney • FAST/eFAST • Denver Criteria (BCVI) 4. HERNIA • Nyhus Classification • Gilbert Classification • EHS Classification • Ventral Hernia Working Group Classification • Amyand Hernia • Littre Hernia • Richter Hernia 5. BREAST • BI-RADS • Nottingham Prognostic Index (NPI) • Bloom–Richardson Grade • Elston–Ellis Modification • Nottingham Histological Grade • TNM – Breast Carcinoma 6. THYROID • Bethesda System • TIRADS • ATA Risk Stratification • ATA Recurrence Risk • TNM – Thyroid Carcinoma 7. ESOPHAGUS • Los Angeles Classification • Prague Classification • Zargar Classification • Siewert Classification • TNM – Esophageal Carcinoma 8. STOMACH • Johnson Classification • Forrest Classification • Modified Johnson Classification • TNM – Gastric Carcinoma 9. SMALL INTESTINE • Peritoneal Cancer Index (PCI) • Short Bowel Syndrome Classification 10. APPENDIX • Alvarado Score • AIR Score • Appendicitis Severity Grade 11. COLORECTAL • Dukes Classification • Astler–Coller Classification • Hinchey Classification • Goligher Classification • Parks Classification • Goodsall's Rule • TNM – Colorectal Carcinoma 12. HEPATOBILIARY • Child–Pugh Score • MELD Score • Tokyo Guidelines • Strasberg Classification • Bismuth–Corlette Classification • Mirizzi Classification • Nagakawa Classification • TNM – Hepatocellular Carcinoma • TNM – Gallbladder Carcinoma • TNM – Cholangiocarcinoma 13. PANCREAS • Revised Atlanta Classification • Ranson Criteria • BISAP Score • Modified CT Severity Index (CTSI) • Balthazar CT Severity Index • TNM – Pancreatic Carcinoma 14. SPLEEN • AAST Splenic Injury Scale 15. VASCULAR SURGERY • CEAP Classification • Venous Clinical Severity Score (VCSS) • Rutherford Classification • Fontaine Classification • WiFi Classification • Wells Score (DVT) • Wells Score (PE) • Villalta Score 16. UROLOGY • Bosniak Classification • RENAL Nephrometry Score • Fuhrman Grade • WHO/ISUP Grade • TNM – Renal Cell Carcinoma • TNM – Urinary Bladder Carcinoma • TNM – Penile Carcinoma • TNM – Testicular Tumour 17. PERITONITIS & SEPSIS • Mannheim Peritonitis Index • Boey Score • qSOFA • SOFA • APACHE II 18. SHOCK • ATLS Hemorrhagic Shock Classification • Modified Shock Index 19. ANASTOMOSIS • ISGLS Anastomotic Leak Classification • ISGPS Pancreatic Fistula Classification • Clavien–Dindo Classification 20. FRACTURES • Gustilo–Anderson Classification • AO Classification • Garden Classification • Neer Classification • Salter–Harris Classification 21. SOFT TISSUE TUMOURS • Enneking Classification • FNCLCC Grading • TNM – Soft Tissue Sarcoma 22. SKIN • Clark Levels • Breslow Thickness • TNM – Melanoma 23. ONCOLOGY • TNM Staging Principles • AJCC Stage Grouping • ECOG Performance Status • Karnofsky Performance Scale • RECIST Criteria 24. NUTRITION • MUST Score • NRS-2002 • Subjective Global Assessment (SGA) 25. ICU & PERIOPERATIVE CARE • ASA Physical Status Classification • Ramsay Sedation Score • Richmond Agitation Sedation Scale (RASS) • Modified Aldrete Score As single PDF to me
MASTER LIST OF IMPORTANT CLASSIFICATIONS, SCORES, STAGING & PROTOCOLS (MS General Surgery University + NEET SS) 1. GENERAL SURGERY • Wound Classification (CDC) • Types of Wound Healing • Surgical Site Infection (CDC) • Clavien–Dindo Classification • Southampton Wound Grading • ASA Physical Status Classification • Ramsay Sedation Score • WHO Surgical Safety Checklist • Damage Control Surgery • ERAS Protocol • SIRS Criteria • qSOFA Score • SOFA Score • APACHE II Score • Charlson Comorbidity Index • ECOG Performance Status • Karnofsky Performance Scale 2. BURNS • Burn Depth (1st–4th Degree) • Jackson's Zones of Burn • Rule of Nines • Lund & Browder Chart • Parkland Formula • Modified Brooke Formula • ABSI Score • Baux Score • Burn Centre Referral Criteria 3. TRAUMA • ATLS Primary Survey • Glasgow Coma Scale (GCS) • Injury Severity Score (ISS) • Revised Trauma Score (RTS) • TRISS • Mangled Extremity Severity Score (MESS) • AAST Organ Injury Scale - Liver - Spleen - Kidney • FAST/eFAST • Denver Criteria (BCVI) 4. HERNIA • Nyhus Classification • Gilbert Classification • EHS Classification • Ventral Hernia Working Group Classification • Amyand Hernia • Littre Hernia • Richter Hernia 5. BREAST • BI-RADS • Nottingham Prognostic Index (NPI) • Bloom–Richardson Grade • Elston–Ellis Modification • Nottingham Histological Grade • TNM – Breast Carcinoma 6. THYROID • Bethesda System • TIRADS • ATA Risk Stratification • ATA Recurrence Risk • TNM – Thyroid Carcinoma 7. ESOPHAGUS • Los Angeles Classification • Prague Classification • Zargar Classification • Siewert Classification • TNM – Esophageal Carcinoma 8. STOMACH • Johnson Classification • Forrest Classification • Modified Johnson Classification • TNM – Gastric Carcinoma 9. SMALL INTESTINE • Peritoneal Cancer Index (PCI) • Short Bowel Syndrome Classification 10. APPENDIX • Alvarado Score • AIR Score • Appendicitis Severity Grade 11. COLORECTAL • Dukes Classification • Astler–Coller Classification • Hinchey Classification • Goligher Classification • Parks Classification • Goodsall's Rule • TNM – Colorectal Carcinoma 12. HEPATOBILIARY • Child–Pugh Score • MELD Score • Tokyo Guidelines • Strasberg Classification • Bismuth–Corlette Classification • Mirizzi Classification • Nagakawa Classification • TNM – Hepatocellular Carcinoma • TNM – Gallbladder Carcinoma • TNM – Cholangiocarcinoma 13. PANCREAS • Revised Atlanta Classification • Ranson Criteria • BISAP Score • Modified CT Severity Index (CTSI) • Balthazar CT Severity Index • TNM – Pancreatic Carcinoma 14. SPLEEN • AAST Splenic Injury Scale 15. VASCULAR SURGERY • CEAP Classification • Venous Clinical Severity Score (VCSS) • Rutherford Classification • Fontaine Classification • WiFi Classification • Wells Score (DVT) • Wells Score (PE) • Villalta Score 16. UROLOGY • Bosniak Classification • RENAL Nephrometry Score • Fuhrman Grade • WHO/ISUP Grade • TNM – Renal Cell Carcinoma • TNM – Urinary Bladder Carcinoma • TNM – Penile Carcinoma • TNM – Testicular Tumour 17. PERITONITIS & SEPSIS • Mannheim Peritonitis Index • Boey Score • qSOFA • SOFA • APACHE II 18. SHOCK • ATLS Hemorrhagic Shock Classification • Modified Shock Index 19. ANASTOMOSIS • ISGLS Anastomotic Leak Classification • ISGPS Pancreatic Fistula Classification • Clavien–Dindo Classification 20. FRACTURES • Gustilo–Anderson Classification • AO Classification • Garden Classification • Neer Classification • Salter–Harris Classification 21. SOFT TISSUE TUMOURS • Enneking Classification • FNCLCC Grading • TNM – Soft Tissue Sarcoma 22. SKIN • Clark Levels • Breslow Thickness • TNM – Melanoma 23. ONCOLOGY • TNM Staging Principles • AJCC Stage Grouping • ECOG Performance Status • Karnofsky Performance Scale • RECIST Criteria 24. NUTRITION • MUST Score • NRS-2002 • Subjective Global Assessment (SGA) 25. ICU & PERIOPERATIVE CARE • ASA Physical Status Classification • Ramsay Sedation Score • Richmond Agitation Sedation Scale (RASS) • Modified Aldrete Score As single PDF to me
MASTER LIST OF IMPORTANT CLASSIFICATIONS, SCORES, STAGING & PROTOCOLS (MS General Surgery University + NEET SS) 1. GENERAL SURGERY • Wound Classification (CDC) • Types of Wound Healing • Surgical Site Infection (CDC) • Clavien–Dindo Classification • Southampton Wound Grading • ASA Physical Status Classification • Ramsay Sedation Score • WHO Surgical Safety Checklist • Damage Control Surgery • ERAS Protocol • SIRS Criteria • qSOFA Score • SOFA Score • APACHE II Score • Charlson Comorbidity Index • ECOG Performance Status • Karnofsky Performance Scale 2. BURNS • Burn Depth (1st–4th Degree) • Jackson's Zones of Burn • Rule of Nines • Lund & Browder Chart • Parkland Formula • Modified Brooke Formula • ABSI Score • Baux Score • Burn Centre Referral Criteria 3. TRAUMA • ATLS Primary Survey • Glasgow Coma Scale (GCS) • Injury Severity Score (ISS) • Revised Trauma Score (RTS) • TRISS • Mangled Extremity Severity Score (MESS) • AAST Organ Injury Scale - Liver - Spleen - Kidney • FAST/eFAST • Denver Criteria (BCVI) 4. HERNIA • Nyhus Classification • Gilbert Classification • EHS Classification • Ventral Hernia Working Group Classification • Amyand Hernia • Littre Hernia • Richter Hernia 5. BREAST • BI-RADS • Nottingham Prognostic Index (NPI) • Bloom–Richardson Grade • Elston–Ellis Modification • Nottingham Histological Grade • TNM – Breast Carcinoma 6. THYROID • Bethesda System • TIRADS • ATA Risk Stratification • ATA Recurrence Risk • TNM – Thyroid Carcinoma 7. ESOPHAGUS • Los Angeles Classification • Prague Classification • Zargar Classification • Siewert Classification • TNM – Esophageal Carcinoma 8. STOMACH • Johnson Classification • Forrest Classification • Modified Johnson Classification • TNM – Gastric Carcinoma 9. SMALL INTESTINE • Peritoneal Cancer Index (PCI) • Short Bowel Syndrome Classification 10. APPENDIX • Alvarado Score • AIR Score • Appendicitis Severity Grade 11. COLORECTAL • Dukes Classification • Astler–Coller Classification • Hinchey Classification • Goligher Classification • Parks Classification • Goodsall's Rule • TNM – Colorectal Carcinoma 12. HEPATOBILIARY • Child–Pugh Score • MELD Score • Tokyo Guidelines • Strasberg Classification • Bismuth–Corlette Classification • Mirizzi Classification • Nagakawa Classification • TNM – Hepatocellular Carcinoma • TNM – Gallbladder Carcinoma • TNM – Cholangiocarcinoma 13. PANCREAS • Revised Atlanta Classification • Ranson Criteria • BISAP Score • Modified CT Severity Index (CTSI) • Balthazar CT Severity Index • TNM – Pancreatic Carcinoma 14. SPLEEN • AAST Splenic Injury Scale 15. VASCULAR SURGERY • CEAP Classification • Venous Clinical Severity Score (VCSS) • Rutherford Classification • Fontaine Classification • WiFi Classification • Wells Score (DVT) • Wells Score (PE) • Villalta Score 16. UROLOGY • Bosniak Classification • RENAL Nephrometry Score • Fuhrman Grade • WHO/ISUP Grade • TNM – Renal Cell Carcinoma • TNM – Urinary Bladder Carcinoma • TNM – Penile Carcinoma • TNM – Testicular Tumour 17. PERITONITIS & SEPSIS • Mannheim Peritonitis Index • Boey Score • qSOFA • SOFA • APACHE II 18. SHOCK • ATLS Hemorrhagic Shock Classification • Modified Shock Index 19. ANASTOMOSIS • ISGLS Anastomotic Leak Classification • ISGPS Pancreatic Fistula Classification • Clavien–Dindo Classification 20. FRACTURES • Gustilo–Anderson Classification • AO Classification • Garden Classification • Neer Classification • Salter–Harris Classification 21. SOFT TISSUE TUMOURS • Enneking Classification • FNCLCC Grading • TNM – Soft Tissue Sarcoma 22. SKIN • Clark Levels • Breslow Thickness • TNM – Melanoma 23. ONCOLOGY • TNM Staging Principles • AJCC Stage Grouping • ECOG Performance Status • Karnofsky Performance Scale • RECIST Criteria 24. NUTRITION • MUST Score • NRS-2002 • Subjective Global Assessment (SGA) 25. ICU & PERIOPERATIVE CARE • ASA Physical Status Classification • Ramsay Sedation Score • Richmond Agitation Sedation Scale (RASS) • Modified Aldrete Score As single PDF to me, with source as bailey and love, Sabiston surgery textbook Maingots surgery textbook, schwartz, Fischers
mkdir -p /home/daytona/workspace/surgery-classifications && ls /home/daytona/workspace/surgery-classifications/
1. GENERAL SURGERY • Wound Classification (CDC) • Types of Wound Healing • Surgical Site Infection (CDC) • Clavien–Dindo Classification • WHO Surgical Safety Checklist • Damage Control Surgery • ERAS Protocol • SIRS Criteria • qSOFA Score • SOFA Score • APACHE II Score • Charlson Comorbidity Index • ECOG Performance Status • Karnofsky Performance Scale 2. BURNS • Burn Depth (1st–4th Degree) • Jackson's Zones of Burn • Rule of Nines • Lund & Browder Chart • Parkland Formula • Modified Brooke Formula • ABSI Score • Baux Score • Burn Centre Referral Criteria 3. TRAUMA • ATLS Primary Survey • Glasgow Coma Scale (GCS) • Injury Severity Score (ISS) • Revised Trauma Score (RTS) • TRISS • Mangled Extremity Severity Score (MESS) • AAST Organ Injury Scale - Liver - Spleen - Kidney • FAST/eFAST • Denver Criteria (BCVI) 4. HERNIA • Nyhus Classification • Gilbert Classification • EHS Classification • Ventral Hernia Working Group Classification • Amyand Hernia • Littre Hernia • Richter Hernia 5. BREAST • BI-RADS • Nottingham Prognostic Index (NPI) • Bloom–Richardson Grade • Elston–Ellis Modification • Nottingham Histological Grade • TNM – Breast Carcinoma 6. THYROID • Bethesda System • TIRADS • ATA Risk Stratification • ATA Recurrence Risk • TNM – Thyroid Carcinoma 7. ESOPHAGUS • Los Angeles Classification • Prague Classification • Zargar Classification • Siewert Classification • TNM – Esophageal Carcinoma 8. STOMACH • Johnson Classification • Forrest Classification • Modified Johnson Classification • TNM – Gastric Carcinoma 9. SMALL INTESTINE • Short Bowel Syndrome Classification 10. APPENDIX • Alvarado Score • AIR Score • Appendicitis Severity Grade 11. COLORECTAL • Dukes Classification • Astler–Coller Classification • Hinchey Classification • Goligher Classification • Parks Classification • Goodsall's Rule • TNM – Colorectal Carcinoma 12. HEPATOBILIARY • Child–Pugh Score • MELD Score • Tokyo Guidelines • Strasberg Classification • Bismuth–Corlette Classification • Mirizzi Classification • Nagakawa Classification • TNM – Hepatocellular Carcinoma • TNM – Gallbladder Carcinoma • TNM – Cholangiocarcinoma 13. PANCREAS • Revised Atlanta Classification • Ranson Criteria • BISAP Score • Modified CT Severity Index (CTSI) • Balthazar CT Severity Index • TNM – Pancreatic Carcinoma 14. SPLEEN • AAST Splenic Injury Scale 15. VASCULAR SURGERY • CEAP Classification • Rutherford Classification • Fontaine Classification • WiFi Classification • Wells Score (DVT) • Wells Score (PE) 16. UROLOGY • Bosniak Classification • WHO/ISUP Grade • TNM – Renal Cell Carcinoma • TNM – Urinary Bladder Carcinoma • TNM – Penile Carcinoma • TNM – Testicular Tumour 17. PERITONITIS & SEPSIS • qSOFA • SOFA • APACHE II 18. SHOCK • ATLS Hemorrhagic Shock Classification • Modified Shock Index 19. ANASTOMOSIS • ISGLS Anastomotic Leak Classification • Clavien–Dindo Classification 21. SOFT TISSUE TUMOURS • Enneking Classification • FNCLCC Grading • TNM – Soft Tissue Sarcoma 22. SKIN • Clark Levels • Breslow Thickness 23. ONCOLOGY • TNM Staging Principles • AJCC Stage Grouping • ECOG Performance Status • Karnofsky Performance Scale • RECIST Criteria 24. NUTRITION • MUST Score With above mentioned surgery textbook as source
?
1. GENERAL SURGERY • Wound Classification (CDC) • Types of Wound Healing • Surgical Site Infection (CDC) • Clavien–Dindo Classification • WHO Surgical Safety Checklist • Damage Control Surgery • ERAS Protocol • SIRS Criteria • qSOFA Score • SOFA Score • APACHE II Score • Charlson Comorbidity Index • ECOG Performance Status • Karnofsky Performance Scale 2. BURNS • Burn Depth (1st–4th Degree) • Jackson's Zones of Burn • Rule of Nines • Lund & Browder Chart • Parkland Formula • Modified Brooke Formula • ABSI Score • Baux Score • Burn Centre Referral Criteria 3. TRAUMA • ATLS Primary Survey • Glasgow Coma Scale (GCS) • Injury Severity Score (ISS) • Revised Trauma Score (RTS) • TRISS • Mangled Extremity Severity Score (MESS) • AAST Organ Injury Scale - Liver - Spleen - Kidney • FAST/eFAST • Denver Criteria (BCVI) 4. HERNIA • Nyhus Classification • Gilbert Classification • EHS Classification • Ventral Hernia Working Group Classification • Amyand Hernia • Littre Hernia • Richter Hernia 5. BREAST • BI-RADS • Nottingham Prognostic Index (NPI) • Bloom–Richardson Grade • Elston–Ellis Modification • Nottingham Histological Grade • TNM – Breast Carcinoma 6. THYROID • Bethesda System • TIRADS • ATA Risk Stratification • ATA Recurrence Risk • TNM – Thyroid Carcinoma 7. ESOPHAGUS • Los Angeles Classification • Prague Classification • Zargar Classification • Siewert Classification • TNM – Esophageal Carcinoma 8. STOMACH • Johnson Classification • Forrest Classification • Modified Johnson Classification • TNM – Gastric Carcinoma 9. SMALL INTESTINE • Short Bowel Syndrome Classification 10. APPENDIX • Alvarado Score • AIR Score • Appendicitis Severity Grade With sources as bailey and love Sabiston fischer schwartz surgery textbook
Send important classifications from general Surgery for a MS GENERAL SURGERY RESIDENT including trauma general surgery, Git, GUT, vascular, endocrine transplant and necessary from. Bailey and love Sabiston fischer schwartz surgery textbook as sources
With S.das and Makhan Lal shah as sources Kindly give how to perform tests in MS general surgery level Cases of PVD, breast, thyroid, Abdominal Lump, varicose veins, hernia, hydrocele, common swellings, Ulcer.
~/surgery-classifications/clinical_exam_guide.py
#!/usr/bin/env python3
"""
MS General Surgery Clinical Examination Guide
Sources: S. Das (A Manual on Clinical Surgery), Makhan Lal Shah (Clinical Methods in Surgery)
"""
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, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import BaseDocTemplate, Frame, PageTemplate
from reportlab.lib.colors import HexColor
# ── Colour palette ──────────────────────────────────────────────────────────
DARK_BLUE = HexColor("#0D2B5E")
MED_BLUE = HexColor("#1A4B8C")
LIGHT_BLUE = HexColor("#D6E4F7")
ACCENT = HexColor("#C0392B")
GREEN = HexColor("#1A6B3C")
LIGHT_GREEN = HexColor("#D5F0E2")
GOLD = HexColor("#B8860B")
LIGHT_GOLD = HexColor("#FFF8DC")
GREY_BG = HexColor("#F5F5F5")
DARK_GREY = HexColor("#333333")
MED_GREY = HexColor("#666666")
TABLE_HDR = HexColor("#1A4B8C")
TABLE_ALT = HexColor("#EBF2FB")
OUTPUT = "/home/daytona/workspace/surgery-classifications/MS_Surgery_Clinical_Exam_Guide.pdf"
# ── Styles ───────────────────────────────────────────────────────────────────
def make_styles():
base = getSampleStyleSheet()
s = {}
s['cover_title'] = ParagraphStyle('cover_title',
fontName='Helvetica-Bold', fontSize=26, textColor=colors.white,
alignment=TA_CENTER, spaceAfter=8, leading=32)
s['cover_sub'] = ParagraphStyle('cover_sub',
fontName='Helvetica', fontSize=14, textColor=HexColor("#D6E4F7"),
alignment=TA_CENTER, spaceAfter=6, leading=18)
s['cover_source'] = ParagraphStyle('cover_source',
fontName='Helvetica-Oblique', fontSize=11, textColor=HexColor("#FFD700"),
alignment=TA_CENTER, spaceAfter=4, leading=15)
s['ch_num'] = ParagraphStyle('ch_num',
fontName='Helvetica-Bold', fontSize=11, textColor=colors.white,
alignment=TA_CENTER, spaceAfter=0)
s['ch_title'] = ParagraphStyle('ch_title',
fontName='Helvetica-Bold', fontSize=16, textColor=colors.white,
alignment=TA_LEFT, spaceAfter=0, leading=20)
s['section'] = ParagraphStyle('section',
fontName='Helvetica-Bold', fontSize=12, textColor=MED_BLUE,
spaceBefore=10, spaceAfter=4, leading=16,
borderPad=3, leftIndent=0)
s['subsection'] = ParagraphStyle('subsection',
fontName='Helvetica-Bold', fontSize=10.5, textColor=DARK_BLUE,
spaceBefore=7, spaceAfter=3, leading=14)
s['body'] = ParagraphStyle('body',
fontName='Helvetica', fontSize=9.5, textColor=DARK_GREY,
spaceAfter=3, leading=14, alignment=TA_JUSTIFY)
s['bullet'] = ParagraphStyle('bullet',
fontName='Helvetica', fontSize=9.5, textColor=DARK_GREY,
spaceAfter=2, leading=13, leftIndent=14, firstLineIndent=-10)
s['bullet2'] = ParagraphStyle('bullet2',
fontName='Helvetica', fontSize=9, textColor=MED_GREY,
spaceAfter=2, leading=12, leftIndent=26, firstLineIndent=-10)
s['note'] = ParagraphStyle('note',
fontName='Helvetica-Oblique', fontSize=9, textColor=GREEN,
spaceAfter=3, leading=13, leftIndent=10,
borderColor=GREEN, borderWidth=0.5, borderPad=4,
backColor=LIGHT_GREEN)
s['key'] = ParagraphStyle('key',
fontName='Helvetica-Bold', fontSize=9, textColor=ACCENT,
spaceAfter=2, leading=13, leftIndent=10)
s['source'] = ParagraphStyle('source',
fontName='Helvetica-Oblique', fontSize=8, textColor=MED_GREY,
spaceAfter=2, leading=11, alignment=TA_RIGHT)
s['toc_ch'] = ParagraphStyle('toc_ch',
fontName='Helvetica-Bold', fontSize=10, textColor=MED_BLUE,
spaceAfter=3, leading=14)
s['toc_item'] = ParagraphStyle('toc_item',
fontName='Helvetica', fontSize=9, textColor=DARK_GREY,
spaceAfter=1, leading=12, leftIndent=12)
return s
S = make_styles()
# ── Helper builders ──────────────────────────────────────────────────────────
def chapter_header(num, title, color=MED_BLUE):
tbl = Table(
[[Paragraph(f"CHAPTER {num}", S['ch_num']),
Paragraph(title, S['ch_title'])]],
colWidths=[2.5*cm, None]
)
tbl.setStyle(TableStyle([
('BACKGROUND', (0,0),(0,0), ACCENT),
('BACKGROUND', (1,0),(1,0), color),
('VALIGN', (0,0),(-1,-1), 'MIDDLE'),
('TOPPADDING', (0,0),(-1,-1), 8),
('BOTTOMPADDING',(0,0),(-1,-1), 8),
('LEFTPADDING',(0,0),(0,0), 6),
('LEFTPADDING',(1,0),(1,0), 12),
('ROUNDEDCORNERS', [4]),
]))
return [tbl, Spacer(1, 6)]
def section_bar(text):
tbl = Table([[Paragraph(text, ParagraphStyle('sb',
fontName='Helvetica-Bold', fontSize=10.5, textColor=colors.white,
alignment=TA_LEFT))]],
colWidths=['100%'])
tbl.setStyle(TableStyle([
('BACKGROUND', (0,0),(-1,-1), MED_BLUE),
('TOPPADDING', (0,0),(-1,-1), 5),
('BOTTOMPADDING',(0,0),(-1,-1), 5),
('LEFTPADDING',(0,0),(-1,-1), 10),
]))
return [Spacer(1,6), tbl, Spacer(1,4)]
def subsec(text):
return [Paragraph(f"► {text}", S['subsection'])]
def body(text):
return [Paragraph(text, S['body'])]
def bul(text, level=1):
style = S['bullet'] if level == 1 else S['bullet2']
prefix = "•" if level == 1 else "–"
return Paragraph(f"{prefix} {text}", style)
def note(text):
return Paragraph(f"★ {text}", S['note'])
def key(text):
return Paragraph(f"KEY: {text}", S['key'])
def src(text):
return Paragraph(f"Source: {text}", S['source'])
def hline(color=LIGHT_BLUE, thickness=1):
return HRFlowable(width="100%", thickness=thickness,
color=color, spaceAfter=4, spaceBefore=4)
def two_col_table(headers, rows, col_w=None):
data = [headers] + rows
n = len(headers)
if col_w is None:
col_w = [None]*n
tbl = Table(data, colWidths=col_w, repeatRows=1)
style = [
('BACKGROUND', (0,0),(-1,0), TABLE_HDR),
('TEXTCOLOR', (0,0),(-1,0), colors.white),
('FONTNAME', (0,0),(-1,0), 'Helvetica-Bold'),
('FONTSIZE', (0,0),(-1,0), 9),
('FONTNAME', (0,1),(-1,-1),'Helvetica'),
('FONTSIZE', (0,1),(-1,-1), 9),
('ALIGN', (0,0),(-1,-1),'LEFT'),
('VALIGN', (0,0),(-1,-1),'TOP'),
('GRID', (0,0),(-1,-1), 0.4, colors.grey),
('TOPPADDING', (0,0),(-1,-1), 4),
('BOTTOMPADDING',(0,0),(-1,-1), 4),
('LEFTPADDING',(0,0),(-1,-1), 5),
]
for i in range(1, len(data), 2):
style.append(('BACKGROUND', (0,i),(-1,i), TABLE_ALT))
tbl.setStyle(TableStyle(style))
return tbl
def source_box(text):
tbl = Table([[Paragraph(f"<i>Sources: {text}</i>",
ParagraphStyle('sb2', fontName='Helvetica-Oblique', fontSize=8,
textColor=GOLD, alignment=TA_LEFT))]],
colWidths=['100%'])
tbl.setStyle(TableStyle([
('BACKGROUND', (0,0),(-1,-1), LIGHT_GOLD),
('TOPPADDING', (0,0),(-1,-1), 4),
('BOTTOMPADDING',(0,0),(-1,-1), 4),
('LEFTPADDING',(0,0),(-1,-1), 8),
('BOX', (0,0),(-1,-1), 0.5, GOLD),
]))
return [Spacer(1,4), tbl, Spacer(1,6)]
SOURCES = "S. Das – A Manual on Clinical Surgery (9th ed.); Makhan Lal Shah – Clinical Methods in Surgery"
# ════════════════════════════════════════════════════════════════════════════
# PAGE CALLBACKS
# ════════════════════════════════════════════════════════════════════════════
def header_footer(canvas, doc):
canvas.saveState()
W, H = A4
# Header bar
canvas.setFillColor(DARK_BLUE)
canvas.rect(0, H-22, W, 22, fill=1, stroke=0)
canvas.setFont('Helvetica-Bold', 8)
canvas.setFillColor(colors.white)
canvas.drawString(18, H-15,
"MS General Surgery — Clinical Examination Guide")
canvas.drawRightString(W-18, H-15, "S. Das | Makhan Lal Shah")
# Footer
canvas.setFillColor(DARK_BLUE)
canvas.rect(0, 0, W, 18, fill=1, stroke=0)
canvas.setFont('Helvetica', 7.5)
canvas.setFillColor(colors.white)
canvas.drawString(18, 5, "For educational use — MS General Surgery Residency")
canvas.drawRightString(W-18, 5, f"Page {doc.page}")
canvas.restoreState()
def cover_page_cb(canvas, doc):
canvas.saveState()
W, H = A4
# Full page gradient-like background
canvas.setFillColor(DARK_BLUE)
canvas.rect(0, 0, W, H, fill=1, stroke=0)
# Decorative band
canvas.setFillColor(ACCENT)
canvas.rect(0, H*0.42, W, 8, fill=1, stroke=0)
canvas.setFillColor(MED_BLUE)
canvas.rect(0, H*0.42+8, W, H*0.58-8, fill=1, stroke=0)
# Bottom band
canvas.setFillColor(MED_BLUE)
canvas.rect(0, 0, W, H*0.10, fill=1, stroke=0)
canvas.restoreState()
# ════════════════════════════════════════════════════════════════════════════
# CONTENT BUILDERS
# ════════════════════════════════════════════════════════════════════════════
def cover(story):
story.append(Spacer(1, 3.5*cm))
story.append(Paragraph("CLINICAL EXAMINATION GUIDE", S['cover_title']))
story.append(Paragraph("for the MS General Surgery Resident", S['cover_sub']))
story.append(Spacer(1, 0.5*cm))
story.append(Paragraph(
"Peripheral Vascular Disease · Breast · Thyroid · Abdominal Lump",
S['cover_sub']))
story.append(Paragraph(
"Varicose Veins · Hernia · Hydrocele · Common Swellings · Ulcer",
S['cover_sub']))
story.append(Spacer(1, 1.5*cm))
story.append(Paragraph("Sources:", S['cover_source']))
story.append(Paragraph("S. Das — A Manual on Clinical Surgery", S['cover_source']))
story.append(Paragraph("Makhan Lal Shah — Clinical Methods in Surgery", S['cover_source']))
story.append(Spacer(1, 2*cm))
story.append(Paragraph("MS General Surgery | University & NEET SS Preparation",
ParagraphStyle('cv', fontName='Helvetica', fontSize=10,
textColor=HexColor("#AAC8F0"), alignment=TA_CENTER)))
story.append(PageBreak())
def toc(story):
story += chapter_header("—", "TABLE OF CONTENTS", MED_BLUE)
chapters = [
("1", "Peripheral Vascular Disease (PVD)",
["History", "General Examination", "Arterial Examination", "Venous Examination",
"Special Tests: Buerger's, Capillary Refill, Allen's, Ankle-Brachial Index"]),
("2", "Breast Examination",
["History", "Inspection", "Palpation", "Lymph Node Examination",
"Special Tests: Paget's test, Skin tethering, Nipple discharge"]),
("3", "Thyroid Examination",
["History", "Inspection", "Palpation", "Percussion & Auscultation",
"Special Tests: Berry's sign, Pemberton's, Kocher's test"]),
("4", "Abdominal Lump",
["History", "Inspection", "Palpation — 10 characteristics",
"Tests: Carnett's, Resonance, Fluctuation, Transillumination"]),
("5", "Varicose Veins",
["History", "Inspection", "Palpation",
"Special Tests: Trendelenburg, Tourniquet, Perthe's, Schwartz, Morrissey"]),
("6", "Hernia",
["History", "Inspection", "Palpation", "Cough impulse",
"Differentiation: Direct vs Indirect, Femoral, Incisional"]),
("7", "Hydrocele",
["History", "Examination", "Transillumination",
"Differentiation from other scrotal swellings"]),
("8", "Common Swellings",
["Sebaceous cyst", "Lipoma", "Dermoid cyst", "Ganglion",
"Lymph node", "Abscess", "Neurofibroma"]),
("9", "Ulcer",
["History", "7 characteristics of an ulcer",
"Arterial vs Venous vs Neuropathic", "Marjolin's ulcer"]),
]
for num, title, items in chapters:
story.append(Paragraph(f"Chapter {num}: {title}", S['toc_ch']))
for item in items:
story.append(Paragraph(f" • {item}", S['toc_item']))
story.append(Spacer(1, 4))
story.append(PageBreak())
# ─── CHAPTER 1: PVD ─────────────────────────────────────────────────────────
def ch1_pvd(story):
story += chapter_header("1", "PERIPHERAL VASCULAR DISEASE (PVD)", DARK_BLUE)
story += source_box(SOURCES)
story += section_bar("1.1 HISTORY")
story += body("A complete vascular history follows the SOCRATES framework for the primary complaint plus vascular-specific questions.")
items = [
("<b>Chief complaint:</b> Pain (claudication / rest pain), ulcer, gangrene, colour change, swelling",
"<b>Claudication:</b> Distance, reproducibility, relieved by rest (5–10 min)"),
("<b>Rest pain:</b> Worse at night, relieved by hanging leg dependent (critical ischaemia)",
"<b>Ulcer / gangrene:</b> Site, onset, progression, pain"),
("<b>Risk factors:</b> Smoking (pack-years), DM, hypertension, dyslipidaemia, family history",
"<b>Past history:</b> Previous vascular procedures, MI, stroke, TIA"),
("<b>Drug history:</b> Antiplatelets, statins, antihypertensives, vasoconstrictors",
"<b>Social history:</b> Occupation, exercise tolerance, walking aids"),
]
tbl = two_col_table(["Symptom / Feature", "Key Points to Elicit"], items,
[8*cm, None])
story.append(tbl)
story.append(Spacer(1,6))
story.append(note("Fontaine Stage I–IV and Rutherford Categories guide clinical severity assessment. "
"Critical limb ischaemia = rest pain >2 weeks OR ulcer/gangrene with ABI <0.4."))
story += section_bar("1.2 GENERAL EXAMINATION")
for t in [
"Build, nourishment, pallor, jaundice, cyanosis (peripheral / central)",
"Nicotine staining of fingers (smoking history)",
"Xanthelasma, corneal arcus — dyslipidaemia",
"Blood pressure: BOTH arms (subclavian stenosis if >15 mmHg difference)",
"Pulse rate, rhythm, character — atrial fibrillation (source of emboli)",
"Carotid bruits — auscultate bilaterally",
"Abdominal aorta palpation for AAA",
]:
story.append(bul(t))
story.append(Spacer(1,5))
story += section_bar("1.3 ARTERIAL EXAMINATION OF THE LOWER LIMB")
story += subsec("INSPECTION")
for t in [
"Colour: pallor (elevated), rubor/dependent flush (Buerger's test positive)",
"Trophic changes: thin shiny skin, loss of hair, nail dystrophy (onychogryphosis)",
"Muscle wasting (chronic ischaemia)",
"Ulcers: site (pressure points — heel, lateral malleolus, toe tips), shape, edge, base",
"Gangrene: dry (arterial) vs wet (infected) — delineate boundary",
]:
story.append(bul(t))
story += subsec("PALPATION")
for t in [
"Skin temperature: compare both limbs symmetrically using back of hand, proximal to distal",
"Capillary refill time (CRT): press nail-bed 5 sec → release → refill <2 sec normal",
"Oedema: pitting/non-pitting, extent",
"Peripheral pulses (always compare bilateral simultaneously where possible):",
]:
story.append(bul(t))
pulse_data = [
["Femoral", "Midpoint of inguinal ligament (ASIS to pubic tubercle)", "Grade 0–3+"],
["Popliteal", "Knee flexed 30°, thumbs on tibial tuberosity, fingers compress popliteal fossa",
"Absent = SFA occlusion"],
["Dorsalis Pedis", "Lateral to extensor hallucis longus tendon", "Absent in 8% normal"],
["Posterior Tibial", "Behind medial malleolus", "Most reliable distal pulse"],
]
tbl2 = two_col_table(["Pulse", "How to Palpate", "Clinical Note"], pulse_data,
[3*cm, 8*cm, None])
story.append(tbl2)
story.append(Spacer(1,6))
story += section_bar("1.4 SPECIAL TESTS — ARTERIAL")
tests_art = [
("Buerger's Test (Angle of Pallor)",
["Elevate both legs to 45° and hold for 2–3 min.",
"Pallor of foot = positive (critical ischaemia); note the angle at which pallor appears.",
"Then hang legs dependent — venous guttering followed by reactive hyperaemia (rubor).",
"Buerger's angle <20° = severe ischaemia."],
"Buerger's angle <20° indicates critical ischaemia requiring urgent revascularisation. "
"(Das, Clinical Surgery, Ch. Peripheral Vascular Disease)"),
("Capillary Refill Time",
["Press nail bed for 5 seconds, release.",
"Normal <2 seconds.",
">3 seconds = poor perfusion."],
"Prolonged CRT with cold extremity = arterial insufficiency."),
("Allen's Test (Upper Limb)",
["Occlude both radial and ulnar arteries simultaneously with examiner's thumbs.",
"Ask patient to make fist several times until hand blanches.",
"Release ulnar artery → hand should flush pink within 5–7 seconds.",
"If hand remains pale → inadequate ulnar collateral → radial artery must NOT be used for arterial line/graft."],
"Mandatory before radial artery harvest for CABG or arterial line insertion."),
("Ankle-Brachial Index (ABI)",
["Doppler probe (8 MHz) at dorsalis pedis / posterior tibial arteries.",
"Measure systolic pressures in both ankles and brachial arteries.",
"ABI = Ankle systolic pressure ÷ Brachial systolic pressure.",
"Normal: 0.9–1.3 | Claudication: 0.5–0.9 | Rest pain: 0.3–0.5 | Critical: <0.3",
">1.3 = calcified vessels (diabetic/CKD) — non-compressible — unreliable."],
"ABI is the single most important non-invasive test for PAD screening. (Das; Sabiston Ch. 62)"),
]
for name, steps, keynote in tests_art:
story += subsec(name)
for i, s in enumerate(steps, 1):
story.append(bul(f"Step {i}: {s}"))
story.append(note(keynote))
story.append(Spacer(1,4))
story += section_bar("1.5 VENOUS EXAMINATION")
story += subsec("INSPECTION")
for t in [
"Dilated tortuous superficial veins — distribution (GSV: medial, SSV: posterior calf)",
"Skin changes: lipodermatosclerosis, haemosiderin pigmentation (CEAP C4)",
"Varicosities: stand patient — veins more prominent",
"Ulcer: gaiter area (medial malleolus) — venous ulcer characteristic site",
"Swelling: pitting oedema — measure calf circumference 10 cm below tibial tuberosity",
]:
story.append(bul(t))
story += subsec("PALPATION")
for t in [
"Saphena varix: cough impulse at saphenofemoral junction (SFJ) in groin",
"Blow-out perforators: localised bulges with fascial defects",
"Tenderness along vein (thrombophlebitis) vs deep tenderness (DVT)",
"Homan's sign (calf pain on dorsiflexion): unreliable, not recommended by Das",
]:
story.append(bul(t))
story.append(note("Homan's sign has poor sensitivity/specificity. Use Wells score + D-dimer for DVT."))
story += section_bar("1.6 SPECIAL TESTS — VENOUS (Varicose Veins)")
venous_tests = [
("Trendelenburg Test",
["Patient supine. Elevate leg 45° and empty veins.",
"Compress SFJ with thumb (or tourniquet at upper thigh).",
"Ask patient to stand.",
"Part 1: Keep thumb on SFJ — veins fill slowly from below = perforator incompetence.",
"Release thumb — rapid filling from above = SFJ incompetence.",
"Part 2 (negative): Veins fill rapidly even with compression = perforator incompetence only."],
"Localises level of incompetence — SFJ vs perforators. (Das, Ch. Varicose Veins)"),
("Tourniquet Test (Multiple)",
["Apply tourniquet sequentially at different levels: upper thigh → above knee → below knee → ankle.",
"Stand patient after each position.",
"Level at which veins fill above the tourniquet = site of incompetent perforator."],
"More precise localisation than Trendelenburg alone."),
("Perthe's Test",
["Apply tourniquet at upper thigh while patient stands.",
"Ask patient to walk briskly for 3–5 minutes.",
"Result: Veins empty = deep veins patent (patient safe for SFJ ligation).",
"Veins do NOT empty / become more prominent / patient gets pain = deep vein obstruction."],
"MANDATORY before any surgical intervention for varicose veins. "
"Perthe's test positive = deep vein obstruction = contraindication to stripping."),
("Schwartz Test",
["Patient standing.",
"Tap (flick) the lower end of the varicosity.",
"Palpate the upper end — feel the transmitted impulse.",
"Positive = continuous column of blood = incompetent valves between the two points."],
"Confirms incompetent valves in the segment being tested."),
("Morrissey Cough Impulse",
["Palpate SFJ (below and medial to the femoral pulse in groin).",
"Ask patient to cough.",
"Expansile impulse felt = saphena varix / SFJ incompetence."],
"Differentiates saphena varix from femoral hernia (hernia = reducible, no thrill)."),
]
for name, steps, keynote in venous_tests:
story += subsec(name)
for i, s in enumerate(steps, 1):
story.append(bul(f"Step {i}: {s}"))
story.append(note(keynote))
story.append(Spacer(1,4))
story.append(PageBreak())
# ─── CHAPTER 2: BREAST ──────────────────────────────────────────────────────
def ch2_breast(story):
story += chapter_header("2", "BREAST EXAMINATION", MED_BLUE)
story += source_box(SOURCES)
story += section_bar("2.1 HISTORY")
breast_hx = [
["Lump", "Duration, onset, single/multiple, change in size with menstrual cycle"],
["Pain", "Mastalgia: cyclical (benign) vs non-cyclical; relation to menstrual cycle"],
["Nipple discharge", "Colour (clear/milky/blood-stained), unilateral/bilateral, spontaneous/expressed"],
["Skin changes", "Redness, peau d'orange, nipple inversion (recent onset = malignancy)"],
["Menstrual history", "LMP, menarche age, menopause, parity, lactation, OCP use"],
["Family history", "First-degree relative with breast/ovarian cancer (BRCA1/2)"],
["Previous biopsies", "Histology, previous imaging"],
["HRT / OCP", "Duration of use"],
]
story.append(two_col_table(["Feature", "Points to Elicit"], breast_hx, [4*cm, None]))
story.append(Spacer(1,6))
story += section_bar("2.2 POSITIONING")
for t in [
"Patient seated on examination table, arms at sides initially",
"Expose both breasts fully — privacy maintained, chaperone present",
"Later positions: arms raised above head, hands on hips (pressing), leaning forward",
]:
story.append(bul(t))
story += section_bar("2.3 INSPECTION")
story += subsec("Inspect in 4 positions:")
for p in ["1. Arms at sides (relaxed)", "2. Arms raised above head",
"3. Hands pressed on hips (pectoral contraction)",
"4. Leaning forward (pendulous breasts)"]:
story.append(bul(p))
story += subsec("Look for:")
inspect_items = [
("Asymmetry / change in contour", "Skin dimpling — tethering to Cooper's ligaments"),
("Peau d'orange (skin oedema)", "Nipple retraction / inversion (recent = carcinoma)"),
("Nipple deviation / elevation", "Skin discolouration / erythema"),
("Dilated veins over breast", "Visible lump / fullness"),
("Paget's disease of nipple", "Eczematous, erythematous, crusting around areola"),
]
story.append(two_col_table(["Inspect For", "Clinical Significance"],
inspect_items, [7*cm, None]))
story.append(Spacer(1,6))
story += section_bar("2.4 PALPATION")
story += subsec("Patient position: Supine, hand of examined side behind head")
for t in [
"Use flat of fingers (not fingertips) — systematic pattern: radial spokes / concentric circles",
"Examine all 4 quadrants + axillary tail (tail of Spence)",
"Include subareolar region and nipple last",
]:
story.append(bul(t))
story += subsec("10 Characteristics of a Breast Lump (S. Das)")
chars = [
["1. Site", "Which quadrant (upper outer most common for carcinoma)"],
["2. Size", "Measure in cm — length x breadth x depth"],
["3. Shape", "Round, oval, irregular"],
["4. Surface", "Smooth (fibroadenoma), irregular (carcinoma)"],
["5. Edge / Margin", "Well-defined (benign) vs ill-defined (malignant)"],
["6. Consistency", "Firm/rubbery (FA), hard (carcinoma), soft (cyst, abscess)"],
["7. Tenderness", "Tender = abscess, fat necrosis; non-tender = carcinoma"],
["8. Mobility", "Mobile = fibroadenoma ('breast mouse'); fixed to skin/pectoral = malignant"],
["9. Skin over lump", "Tethering, dimpling, peau d'orange"],
["10. Nipple", "Discharge, retraction, Paget's changes"],
]
story.append(two_col_table(["Characteristic", "Normal vs Abnormal Findings"],
chars, [3.5*cm, None]))
story.append(Spacer(1,6))
story += section_bar("2.5 SKIN TETHERING TEST")
for t in [
"Hold the lump gently and move it.",
"Observe the overlying skin for dimpling — indicates attachment to Cooper's ligaments.",
"Ask patient to press hands on hips (pectoral contraction) — if lump becomes less mobile = deep fixity to pectoralis major.",
"Fixation to chest wall: ask patient to lean forward — lump falls forward but chest wall stays = mobile from chest wall.",
]:
story.append(bul(t))
story.append(note("Skin tethering + pectoral fixation = features of malignancy. "
"Pure mobility (slides on pectoralis) = benign."))
story += section_bar("2.6 NIPPLE EXAMINATION")
for t in [
"Inspect: retraction (new vs longstanding), deviation, Paget's changes",
"Palpate subareolar region",
"Express discharge: note colour, site of duct (clock position)",
]:
story.append(bul(t))
discharge_tbl = [
["Milky", "Galactorrhoea — prolactinoma, drugs (metoclopramide, antipsychotics)"],
["Clear serous", "Fibrocystic disease, ductal ectasia"],
["Green/brown", "Ductal ectasia"],
["Blood-stained", "Intraductal papilloma (MC), carcinoma, Paget's disease"],
["Purulent", "Abscess, mastitis"],
]
story.append(two_col_table(["Discharge Type", "Likely Cause"],
discharge_tbl, [3.5*cm, None]))
story.append(Spacer(1,6))
story.append(note("Single duct blood-stained discharge in >40 y = intraductal carcinoma until proved otherwise."))
story += section_bar("2.7 LYMPH NODE EXAMINATION")
story += subsec("Axillary Lymph Nodes — 5 Groups (Das)")
ln_groups = [
["Anterior (pectoral)", "Along lower border of pectoralis minor — examine with patient's arm resting on examiner's forearm"],
["Posterior (subscapular)", "Along subscapular vessels at posterior axillary fold"],
["Lateral", "Along axillary vein — medial wall of axilla"],
["Central", "Central pad of fat — most palpable group in normal individuals"],
["Apical (infraclavicular)", "Below clavicle medial to pectoralis minor — high axillary"],
]
story.append(two_col_table(["Group", "How to Palpate"], ln_groups, [4*cm, None]))
story.append(Spacer(1,6))
story += subsec("Supraclavicular Nodes")
story.append(bul("Stand behind patient — palpate in supraclavicular fossa bilaterally"))
story.append(bul("Virchow's node: left supraclavicular — GI primary (Troisier's sign)"))
story.append(bul("Right supraclavicular node + right breast primary = N3 disease"))
story += section_bar("2.8 SPECIAL TESTS")
breast_special = [
("Paget's Test",
["Inspect areola and nipple for eczematous, erythematous, crusted lesion.",
"Palpate subareolar tissue for underlying mass.",
"Perform nipple smear (cytology) if Paget's suspected.",
"Biopsy of nipple confirms Paget's disease."],
"Paget's disease of nipple = epidermotropic spread of ductal carcinoma in situ. "
"Always has underlying DCIS; 50% have invasive carcinoma."),
("Halsted's Test (Pectoral Fixation)",
["Ask patient to press hands firmly on hips (contracts pectoralis major).",
"Try to move the lump.",
"If mobility decreases = lump fixed to pectoralis major fascia (T4a in TNM)."],
"T4 disease = inoperable by standard mastectomy alone — requires neoadjuvant treatment."),
]
for name, steps, keynote in breast_special:
story += subsec(name)
for i, s in enumerate(steps, 1):
story.append(bul(f"Step {i}: {s}"))
story.append(note(keynote))
story.append(Spacer(1,4))
story.append(PageBreak())
# ─── CHAPTER 3: THYROID ─────────────────────────────────────────────────────
def ch3_thyroid(story):
story += chapter_header("3", "THYROID EXAMINATION", GREEN)
story += source_box(SOURCES)
story += section_bar("3.1 HISTORY")
thyroid_hx = [
["Swelling", "Duration, onset, rate of growth, painful/painless"],
["Thyroid status", "Heat/cold intolerance, palpitations, weight change, tremor, bowel habit"],
["Compressive symptoms", "Dysphagia, dyspnoea, stridor, hoarseness (RLN involvement)"],
["Family history", "MEN2, familial medullary thyroid carcinoma"],
["Radiation exposure", "Head/neck radiation in childhood = increased PTC risk"],
["Iodine deficiency", "Endemic goitre area, diet"],
["Drugs", "Amiodarone, lithium, antithyroid drugs"],
["Pregnancy/recent delivery", "Postpartum thyroiditis"],
]
story.append(two_col_table(["Feature", "Points to Elicit"], thyroid_hx, [4*cm, None]))
story.append(Spacer(1,6))
story += section_bar("3.2 GENERAL EXAMINATION")
for t in [
"Build: obesity (hypothyroid), thin/cachectic (hyperthyroid/malignancy)",
"Pulse: bradycardia (hypothyroid), tachycardia/AF (hyperthyroid)",
"Tremor: fine resting tremor of outstretched hands (hyperthyroidism)",
"Palms: warm, moist, sweaty (hyperthyroid); dry, cold (hypothyroid)",
"Eyes: exophthalmos, lid lag, lid retraction, ophthalmoplegia (Graves' disease)",
"Pretibial myxoedema: waxy thickening of skin on anterior tibia (Graves')",
"Hair: fine/brittle (hyperthyroid), coarse/loss (hypothyroid)",
"Reflexes: brisk (hyperthyroid), slow-relaxing (hypothyroid)",
]:
story.append(bul(t))
story += section_bar("3.3 EXAMINATION OF THYROID SWELLING")
story += subsec("POSITIONING")
story.append(bul("Patient seated, neck slightly extended, examiner stands in front initially, then behind"))
story.append(bul("Good light source"))
story.append(bul("Glass of water on table for swallowing test"))
story += subsec("INSPECTION")
for t in [
"Site: midline vs lateral (thyroid moves with swallowing — midline)",
"Size: visible enlargement (grade the goitre — WHO Grade 0/1/2)",
"Shape: diffuse symmetrical (Graves', Hashimoto's), multinodular, solitary nodule",
"Surface: smooth vs nodular",
"Skin: normal / dilated veins / redness / scar from previous surgery",
"SWALLOWING TEST: ask patient to swallow sip of water — thyroid swelling MOVES UP with deglutition (attached to pretracheal fascia)",
"Tongue protrusion test: midline neck swelling moves up on tongue protrusion = thyroglossal cyst (NOT thyroid)",
]:
story.append(bul(t))
story.append(note("Thyroid swelling moves with swallowing — diagnostic. "
"Thyroglossal cyst moves BOTH on swallowing AND tongue protrusion."))
story += subsec("PALPATION")
story += body("Stand behind patient (preferred for assessment). Hands placed flat on the neck.")
palpation_pts = [
"Size: measure both lobes + isthmus",
"Shape: diffuse / nodular",
"Surface: smooth (Graves', simple goitre), nodular (MNG), irregular (carcinoma)",
"Consistency: soft (normal/Graves'), firm (MNG, follicular), hard (carcinoma, calcification in papillary Ca)",
"Tenderness: De Quervain's thyroiditis = exquisitely tender",
"Mobility: mobile from side to side — free (benign); fixed to overlying skin/strap muscles = malignant",
"Tracheal position: push trachea aside — assess for tracheal deviation/compression",
"Thrill: vascular goitre (Graves') — palpable thrill over thyroid",
]
for p in palpation_pts:
story.append(bul(p))
story += section_bar("3.4 PERCUSSION & AUSCULTATION")
for t in [
"Percussion: dull note over manubrium sterni = retrosternal goitre (Pemberton's sign pre-test)",
"Auscultation: bruit over thyroid = hyperthyroid (increased vascularity — Graves' disease)",
"Distinguish from carotid bruit: transmitted vs intrinsic",
]:
story.append(bul(t))
story += section_bar("3.5 LYMPH NODE EXAMINATION")
for t in [
"Anterior and posterior cervical chains",
"Submandibular, submental nodes",
"Supraclavicular nodes (left = Virchow's for distant metastasis)",
"Central compartment nodes (level VI): between carotid sheaths — paratracheal",
"Hard, fixed nodes + thyroid nodule = papillary carcinoma (lymphophilic)",
]:
story.append(bul(t))
story += section_bar("3.6 SPECIAL TESTS")
thyroid_special = [
("Berry's Sign",
["Palpate the posterior surface of thyroid lobes, feeling for carotid pulse.",
"Normally: carotid artery is palpable posterolateral to thyroid.",
"Berry's sign POSITIVE: carotid pulse NOT palpable — the thyroid mass has engulfed the carotid artery.",
"Indicates MALIGNANCY with vascular invasion."],
"Berry's sign = carcinoma invading carotid artery. (Das, Clinical Surgery)"),
("Pemberton's Sign",
["Ask patient to raise both arms above head for 1–2 minutes.",
"Look for: facial congestion/plethora, JVP distension, cyanosis of face, stridor.",
"Positive = thoracic inlet obstruction due to retrosternal goitre compressing SVC."],
"Positive Pemberton's = retrosternal goitre causing SVC-type obstruction at thoracic inlet."),
("Kocher's Test",
["Compress both lobes of thyroid gently laterally with fingertips.",
"Positive: patient develops stridor — indicates tracheal softening (tracheomalacia) due to long-standing goitre.",
"Important pre-operative finding — post-thyroidectomy tracheal collapse risk."],
"Positive Kocher's = tracheomalacia. Anaesthetist must be warned. "
"May need tracheal ring fixation at surgery."),
("Crile's Test",
["Stand behind patient.",
"Flex the neck slightly.",
"Place fingers over lower pole of thyroid and ask patient to swallow.",
"If lower pole cannot be felt descending on swallowing = retrosternal extension of goitre."],
"Demonstrates retrosternal goitre — must be confirmed with CXR/CT neck+thorax."),
]
for name, steps, keynote in thyroid_special:
story += subsec(name)
for i, s in enumerate(steps, 1):
story.append(bul(f"Step {i}: {s}"))
story.append(note(keynote))
story.append(Spacer(1,4))
story.append(PageBreak())
# ─── CHAPTER 4: ABDOMINAL LUMP ──────────────────────────────────────────────
def ch4_abdlump(story):
story += chapter_header("4", "ABDOMINAL LUMP", ACCENT)
story += source_box(SOURCES)
story += section_bar("4.1 HISTORY")
abd_hx = [
["Duration/onset", "Gradual vs sudden; any preceding pain, trauma, weight loss"],
["Pain", "Site, radiation, relation to food, defecation, micturition"],
["GI symptoms", "Nausea, vomiting, haematemesis, altered bowel habit, rectal bleeding"],
["Urinary symptoms", "Haematuria, frequency, dysuria, hesitancy"],
["Gynaecological", "LMP, cycle regularity, vaginal bleeding/discharge (females)"],
["Constitutional", "Fever (abscess/lymphoma), night sweats, weight loss (malignancy/TB)"],
["Past history", "Previous surgeries, malignancy, IBD, PID, biliary disease"],
["Family history", "CRC, ovarian cancer, polycystic kidney"],
]
story.append(two_col_table(["Feature", "Points to Elicit"], abd_hx, [4*cm, None]))
story.append(Spacer(1,6))
story += section_bar("4.2 INSPECTION")
for t in [
"Position: supine, single pillow, arms by sides, legs straight",
"Expose from nipple to groin",
"Visible lump: site (quadrant/region), movement with respiration",
"Surface overlying skin: normal, distended veins, scar, striae",
"Peristalsis: visible (intestinal obstruction)",
"Umbilicus: everted (ascites/mass), Sister Mary Joseph nodule (peritoneal mets)",
"Flanks: fullness (ascites, retroperitoneal mass)",
]:
story.append(bul(t))
story += section_bar("4.3 PALPATION — 10 CHARACTERISTICS (S. Das)")
ten_chars = [
["1. Site", "Which quadrant/region of abdomen; describe by 9-region method"],
["2. Size", "Measure in cm (length x breadth); use tape measure"],
["3. Shape", "Round, oval, irregular, reniform (kidney), lobulated"],
["4. Surface", "Smooth vs nodular vs bosselated"],
["5. Edge/Margin", "Well-defined vs ill-defined"],
["6. Consistency", "Soft, firm, hard, cystic, fluctuant"],
["7. Tenderness", "Tender = inflammatory/infective; non-tender = cystic/malignant"],
["8. Mobility", "Moves with respiration (intra-abdominal/retroperitoneal) vs does not"],
["9. Can get above the lump?", "Cannot get above = pelvic mass from below / large tumour"],
["10. Can get below the lump?", "Can get below = hepatomegaly / splenomegaly extends inferiorly"],
]
story.append(two_col_table(["Characteristic", "Clinical Note"], ten_chars, [4.5*cm, None]))
story.append(Spacer(1,6))
story += section_bar("4.4 SPECIFIC ABDOMINAL ORGAN EXAMINATION")
story += subsec("Liver")
for t in [
"Start from RIGHT iliac fossa, move diagonally towards right hypochondrium",
"Ask patient to breathe deeply — liver descends on inspiration",
"Note lower edge, surface, consistency, tenderness",
"Normal liver NOT palpable (unless thin patient)",
"Measure hepatomegaly in fingerbreadths / cm below costal margin in mid-clavicular line",
]:
story.append(bul(t))
story += subsec("Spleen")
for t in [
"Start from RIGHT iliac fossa, move diagonally to LEFT hypochondrium",
"Cannot get above it; moves diagonally with respiration; has notch on medial border",
"Ballottement test: right hand pushes posteriorly, left hand feels anteriorly",
"Turn patient to right lateral decubitus if spleen not palpable",
]:
story.append(bul(t))
story += subsec("Kidney (Bimanual Palpation)")
for t in [
"Place one hand posteriorly in loin (below 12th rib), one hand anteriorly",
"Apply gentle upward pressure from behind — kidney 'ballots' into anterior hand",
"Kidney: resonant (colonic gas in front), ballotable, can get above it",
"Spleen: dull, notch, cannot get above, moves diagonally",
]:
story.append(bul(t))
story += section_bar("4.5 SPECIAL TESTS")
abd_special = [
("Carnett's Test",
["Palpate the tender area with one finger.",
"Ask patient to tense abdominal muscles (lift head off pillow / cross arms over chest).",
"If pain INCREASES = anterior abdominal wall origin (haematoma, hernia, myositis).",
"If pain DECREASES = intraperitoneal visceral origin."],
"Carnett's test differentiates abdominal wall pain from visceral pain. "
"Important to avoid unnecessary laparotomy."),
("Shifting Dullness (Ascites)",
["Percuss from umbilicus to flank — note where dullness begins.",
"Keep finger at dullness point, turn patient towards you (45°).",
"Re-percuss — if previously dull area becomes resonant = shifting dullness = FREE fluid.",
"Sensitivity ~83% for ascites >1 litre."],
"Shifting dullness + fluid thrill = ascites. Always look for primary cause (cirrhosis, malignancy, TB)."),
("Fluid Thrill",
["Place patient's hand (or assistant's hand) along midline of abdomen (dampens subcutaneous fat transmission).",
"Flick one flank sharply.",
"Feel for transmitted thrill at opposite flank.",
"Positive only with LARGE volume of free fluid."],
"Fluid thrill = large volume ascites. Less sensitive than shifting dullness."),
("Transillumination Test",
["In dark room, press torch against one wall of the lump.",
"Observe from opposite side.",
"Transilluminates = thin-walled cyst with clear fluid (hydrocele, cystic hygroma, mesenteric cyst).",
"Does NOT transilluminate = solid, blood-filled, or thick-walled."],
"Transillumination = clear cystic fluid. Classic in hydrocele and cystic hygroma."),
("Murphy's Sign",
["Place two fingers at the tip of 9th costal cartilage (GB fundus).",
"Ask patient to breathe in deeply.",
"Patient catches their breath / grimaces = positive.",
"Compare with same manoeuvre on left (must be asymmetric)."],
"Positive Murphy's = acute cholecystitis. False positive in hepatomegaly. "
"Negative in empyema of GB (fibrosed GB cannot descend)."),
]
for name, steps, keynote in abd_special:
story += subsec(name)
for i, s in enumerate(steps, 1):
story.append(bul(f"Step {i}: {s}"))
story.append(note(keynote))
story.append(Spacer(1,4))
story.append(PageBreak())
# ─── CHAPTER 5: VARICOSE VEINS ──────────────────────────────────────────────
def ch5_vv(story):
story += chapter_header("5", "VARICOSE VEINS", DARK_BLUE)
story += source_box(SOURCES)
story += section_bar("5.1 HISTORY")
vv_hx = [
["Symptoms", "Aching, heaviness, fatigue in legs — worse on prolonged standing"],
["Cosmetic complaint", "Visible dilated veins"],
["Complications", "Bleeding (spontaneous), ulcer, thrombophlebitis, DVT"],
["Risk factors", "Prolonged standing (occupation), obesity, pregnancy, family history, previous DVT"],
["Previous treatment", "Injection sclerotherapy, surgery, stockings"],
["Functional impact", "Exercise tolerance, work, daily activities"],
]
story.append(two_col_table(["Feature", "Points to Elicit"], vv_hx, [4*cm, None]))
story.append(Spacer(1,6))
story += section_bar("5.2 EXAMINATION — STANDING PATIENT")
story += subsec("INSPECTION (Patient standing)")
for t in [
"Examine BOTH legs — compare",
"Dilated tortuous veins: site — medial (GSV territory) vs posterolateral calf (SSV territory)",
"CEAP classification: C0–C6",
"Skin changes: lipodermatosclerosis (woody induration), haemosiderin pigmentation, eczema",
"Corona phlebectatica: fan-shaped telangiectasia at medial ankle = marker of severe CVI",
"Active/healed ulcer: gaiter area (medial malleolus) = venous",
"Oedema: note extent, pitting",
"Scar from previous surgery / injection sites",
]:
story.append(bul(t))
story += subsec("PALPATION (Patient standing)")
for t in [
"Temperature: warm (normal/inflamed); cool (arterial component — mixed aetiology)",
"Tenderness: along vein = superficial thrombophlebitis; deep tenderness = DVT",
"Varicosity consistency: soft compressible = true varix; hard = phlebosclerosis",
"Saphena varix: compressible swelling at SFJ (groin crease), disappears on lying",
"Fascial defects: localised blow-out perforators — felt as defect on palpation",
"Cough impulse at SFJ (Morrissey sign)",
]:
story.append(bul(t))
story += section_bar("5.3 COMPLETE SPECIAL TESTS (Detailed Steps)")
vv_special_full = [
("1. TRENDELENBURG TEST — Two-Part",
["PART 1 — Identifies SFJ incompetence:",
" a. Patient lies supine. Elevate leg to 45° and milk veins empty.",
" b. Compress SFJ with thumb firmly (2 cm below and medial to femoral pulse).",
" c. Patient stands up — observe veins for 30 seconds.",
" d. If veins remain EMPTY with thumb on = SFJ incompetent (reflux was from above).",
" e. Release thumb — rapid filling from above = CONFIRMS SFJ incompetence.",
"PART 2 — Identifies perforator incompetence:",
" a. If veins fill despite thumb compression = incompetent perforators below.",
" b. Repeat with tourniquet at multiple levels to localise."],
"Trendelenburg positive Part 1 = SFJ ligation required. "
"Part 2 positive = perforator surgery (SEPS/EVLT). (Das, Varicose Veins)"),
("2. MULTIPLE TOURNIQUET TEST",
["Apply rubber tourniquet at upper thigh (below SFJ).",
"Patient stands — observe veins below tourniquet.",
"If veins fill = incompetent perforators below tourniquet level.",
"Move tourniquet to just above knee, below knee, then ankle.",
"Level where varicosities appear below but not above = site of incompetent perforator."],
"Allows precise mapping of perforator incompetence before surgery."),
("3. PERTHE'S TEST — Tests deep vein patency",
["Apply tourniquet firmly at upper thigh while patient stands.",
"Ask patient to walk briskly on the spot / up and down for 3–5 minutes.",
"INTERPRETATION:",
" (a) Veins COLLAPSE and EMPTY = Deep veins PATENT — calf muscle pump drains blood into deep system. Safe for surgery.",
" (b) Veins REMAIN DISTENDED = Deep vein obstruction — superficial veins are collaterals.",
" (c) Veins INCREASE + PAIN = Deep vein OBSTRUCTION. CONTRAINDICATION to surgery.",
"NEVER perform SFJ ligation or stripping with positive Perthe's test."],
"Perthe's test POSITIVE (veins don't empty / increase / pain) = "
"deep vein obstruction = absolute contraindication to stripping. (Das, Shah)"),
("4. SCHWARTZ TEST — Tests valve continuity",
["Patient standing.",
"Place two fingers on the varicosity — one at the top, one at the bottom of the segment.",
"Flick (tap) the lower finger sharply.",
"Feel with the upper finger for transmitted percussion impulse.",
"POSITIVE: impulse felt upwards = continuous column of blood = INCOMPETENT valves in segment.",
"NEGATIVE: no impulse = valves still competent — not a varix."],
"Confirms incompetent venous segment. Analogous to Schwartz test for fluid thrill."),
("5. BRODIE-TRENDELENBURG TEST (Classic variation)",
["Same as Trendelenburg Part 1.",
"Used to confirm SFJ incompetence.",
"Specifically: if releasing the thumb causes instant (<30 sec) filling from above = SFJ reflux."],
"Classic teaching test in Das and Shah for varicose veins examination."),
("6. MORRISSEY COUGH IMPULSE TEST",
["Patient standing.",
"Palpate at SFJ (1.5 cm below and medial to the femoral pulse in the groin).",
"Ask patient to cough.",
"Expansile pulsatile impulse = saphena varix / SFJ incompetence.",
"Differentiate from femoral hernia: hernia is reducible, has cough impulse but not pulsatile thrill."],
"Saphena varix mimics femoral hernia. Cough impulse present in both. "
"Thrill + varicosities below = saphena varix."),
]
for name, steps, keynote in vv_special_full:
story += subsec(name)
for s in steps:
story.append(bul(s, level=1 if not s.startswith(" ") else 2))
story.append(note(keynote))
story.append(Spacer(1,5))
story += section_bar("5.4 CEAP CLASSIFICATION SUMMARY")
ceap = [
["C0", "No visible or palpable signs of venous disease"],
["C1", "Telangiectasia or reticular veins (<1 mm)"],
["C2", "Varicose veins (>3 mm)"],
["C3", "Oedema without skin changes"],
["C4a", "Pigmentation or eczema"],
["C4b", "Lipodermatosclerosis or atrophie blanche"],
["C5", "Healed venous ulcer"],
["C6", "Active venous ulcer"],
]
story.append(two_col_table(["CEAP", "Description"], ceap, [2*cm, None]))
story.append(Spacer(1,6))
story.append(PageBreak())
# ─── CHAPTER 6: HERNIA ──────────────────────────────────────────────────────
def ch6_hernia(story):
story += chapter_header("6", "HERNIA EXAMINATION", MED_BLUE)
story += source_box(SOURCES)
story += section_bar("6.1 HISTORY")
for t in [
"Site of swelling: groin (inguinal / femoral), umbilicus, incisional, epigastric, paraumbilical",
"Duration: chronic vs recent acute episode (obstruction/strangulation)",
"Reducibility: spontaneous / manual; does it come back on standing/coughing?",
"Cough impulse: expansion on coughing",
"Pain: dragging discomfort (uncomplicated) vs severe acute pain (strangulation)",
"Bowel symptoms: vomiting, absolute constipation, abdominal distension (obstruction)",
"Risk factors: chronic cough (COPD), BPH (straining), constipation, heavy lifting, ascites",
"Previous hernia repair: technique (open/laparoscopic), time to recurrence",
]:
story.append(bul(t))
story += section_bar("6.2 EXAMINATION POSITIONS")
for t in [
"Patient standing: swelling better seen, cough impulse easier to assess",
"Patient supine: reducibility tested, palpation of defect",
"Both: compare sides",
]:
story.append(bul(t))
story += section_bar("6.3 INSPECTION")
for t in [
"Standing: visible swelling in groin / at hernia site",
"Site: above inguinal ligament (inguinal), below (femoral), umbilical, incisional",
"Shape: rounded lump descending into scrotum (indirect inguinal — follows spermatic cord)",
"Cough impulse: ask patient to cough — watch for expansion",
"Skin: normal vs inflamed, tense, red (strangulation)",
"Look for precipitating factors: distended abdomen (ascites), previous scars",
]:
story.append(bul(t))
story += section_bar("6.4 PALPATION")
story += subsec("Inguinal Hernia")
for t in [
"Stand patient. Palpate swelling — consistency (soft reducible vs tender irreducible)",
"Reducibility: ask patient to push hernia back; if fails — try gentle taxis (patient supine, hip flexed, adducted)",
"Cough impulse: index finger over external inguinal ring — expansile impulse on coughing",
"Finger test for ring: in male, invaginate scrotal skin along cord to reach external ring — feel expansile impulse on coughing",
"Percussion: resonant (bowel inside) vs dull (omentum)",
"Bowel sounds: auscultate over hernia",
]:
story.append(bul(t))
story += section_bar("6.5 DIRECT vs INDIRECT INGUINAL HERNIA")
di_diff = [
["Age", "Young adult", "Middle-aged/elderly"],
["Cause", "Congenital patent processus vaginalis", "Acquired weakness in Hesselbach's triangle"],
["Site of origin", "Lateral to inferior epigastric artery", "Medial to inferior epigastric artery"],
["Neck of sac", "Narrow (risk of strangulation)", "Wide (rarely strangulates)"],
["Direction", "Oblique — follows inguinal canal into scrotum", "Directly forward through posterior wall"],
["Reducibility", "May reduce upwards & laterally", "Reduces directly backwards"],
["Controlled by pressure", "Deep ring pressure controls it", "NOT controlled by deep ring pressure"],
["Zieman's test", "Middle finger (ring 2)", "Index finger (ring 1)"],
["Strangulation risk", "High", "Low"],
]
story.append(two_col_table(["Feature", "Indirect", "Direct"], di_diff,
[4*cm, 5*cm, None]))
story.append(Spacer(1,6))
story += section_bar("6.6 ZIEMAN'S TEST — Distinguishing Inguinal from Femoral")
for t in [
"Patient standing, hernia reduced.",
"Stand on same side as the hernia.",
"Place index finger over the deep inguinal ring (midpoint of inguinal ligament, 1 cm above femoral artery).",
"Place middle finger over the superficial (external) inguinal ring (above pubic tubercle).",
"Place ring finger over the femoral ring (1.5 cm below and medial to femoral pulse).",
"Ask patient to cough.",
"INTERPRETATION:",
]:
story.append(bul(t))
zieman = [
["Index finger (1st)", "Deep inguinal ring", "Impulse here = INDIRECT inguinal hernia"],
["Middle finger (2nd)", "Superficial inguinal ring", "Impulse here = DIRECT inguinal hernia"],
["Ring finger (3rd)", "Femoral ring", "Impulse here = FEMORAL hernia"],
]
story.append(two_col_table(["Finger", "Position", "Interpretation"], zieman,
[3*cm, 5*cm, None]))
story.append(Spacer(1,6))
story.append(note("Zieman's test is a clinical test — not 100% reliable. "
"Most important differentiator: Femoral hernia is BELOW and LATERAL to pubic tubercle; "
"Inguinal hernia is ABOVE and MEDIAL to pubic tubercle."))
story += section_bar("6.7 INGUINAL vs FEMORAL HERNIA DIFFERENTIATION")
if_diff = [
["Relation to pubic tubercle", "ABOVE and MEDIAL", "BELOW and LATERAL"],
["Sex", "Males (>90%)", "Females (femoral ring wider)"],
["Strangulation", "Less common", "HIGH risk (narrow femoral ring)"],
["Reducibility", "Usually reducible", "Often irreducible"],
["Passes through", "Inguinal canal", "Femoral canal"],
]
story.append(two_col_table(["Feature", "Inguinal", "Femoral"], if_diff,
[5*cm, 4*cm, None]))
story.append(Spacer(1,6))
story += section_bar("6.8 SPECIAL TESTS FOR HERNIA")
hernia_special = [
("Invagination Test (Ring Test) — Male",
["Patient standing.",
"Invaginate the skin of the scrotum along the spermatic cord.",
"Reach the external inguinal ring with the tip of the index finger.",
"Ask patient to cough.",
"Feel for expansile impulse at the ring tip.",
"If impulse felt at ring tip = indirect inguinal hernia (comes along the canal).",
"If impulse felt against the pulp of the finger = direct hernia (pushes directly through posterior wall)."],
"Classic distinction: tip of finger = indirect; pulp of finger = direct. (Das)"),
("Deep Ring Occlusion Test",
["Reduce the hernia completely.",
"Compress the deep inguinal ring firmly with thumb (midpoint of inguinal ligament).",
"Ask patient to cough or stand.",
"If hernia DOES NOT reappear = INDIRECT inguinal hernia (controlled at deep ring).",
"If hernia REAPPEARS = DIRECT inguinal hernia (passes through posterior wall, not deep ring)."],
"Most useful bedside test to differentiate direct from indirect. (Shah, Clinical Methods)"),
]
for name, steps, keynote in hernia_special:
story += subsec(name)
for i, s in enumerate(steps, 1):
story.append(bul(f"Step {i}: {s}"))
story.append(note(keynote))
story.append(Spacer(1,4))
story.append(PageBreak())
# ─── CHAPTER 7: HYDROCELE ───────────────────────────────────────────────────
def ch7_hydrocele(story):
story += chapter_header("7", "HYDROCELE & SCROTAL SWELLINGS", DARK_BLUE)
story += source_box(SOURCES)
story += section_bar("7.1 HISTORY")
for t in [
"Duration: congenital (infant) vs acquired",
"Pain: painful (epididymo-orchitis, torsion) vs painless (hydrocele, tumour)",
"Onset: sudden (torsion, trauma) vs gradual",
"Fever: epididymo-orchitis",
"Trauma: haematocele",
"Previous STI or UTI: epididymo-orchitis",
"Weight loss, constitutional symptoms: testicular tumour",
"Reducibility: inguino-scrotal hernia reduces; hydrocele does not",
"Transillumination: patient may notice 'glow' in bright light",
]:
story.append(bul(t))
story += section_bar("7.2 EXAMINATION — SCROTAL SWELLINGS (S. Das Framework)")
story += subsec("Step 1: Can you GET ABOVE the swelling?")
for t in [
"If YES (fingers can be placed above the swelling at the neck of scrotum) = SCROTAL swelling (not extending into abdomen/inguinal canal)",
"If NO (fingers cannot get above) = inguinoscrotal swelling (hernia, encysted hydrocele of cord)",
]:
story.append(bul(t))
story.append(note("This is the FIRST and MOST IMPORTANT clinical question in scrotal examination. (Das)"))
story += subsec("Step 2: Is the testis palpable separately?")
for t in [
"Palpate — can you feel the testis as a separate structure from the swelling?",
"YES = epididymal cyst, epididymo-orchitis affecting just epididymis",
"NO = swelling involves testis (hydrocele, tumour, orchitis)",
]:
story.append(bul(t))
story += subsec("Step 3: Transillumination Test")
for t in [
"In darkened room, apply pen torch to one side of scrotum",
"Look for red glow transmitted through the swelling",
"TRANSILLUMINATES = clear fluid = hydrocele, epididymal cyst",
"DOES NOT transilluminate = solid (testicular tumour), blood (haematocele), pus (pyocele)",
]:
story.append(bul(t))
story.append(note("Transillumination POSITIVE + cannot feel testis separately = HYDROCELE. "
"Always rule out secondary hydrocele (due to underlying testicular tumour) with USS."))
story += section_bar("7.3 TYPES OF HYDROCELE — CLINICAL DISTINCTION")
hydrocele_types = [
["Primary vaginal", "Most common adult type", "Testis not palpable, transilluminates, tense"],
["Congenital", "Communicates with peritoneal cavity", "Reduces on pressure; increases on crying/standing; fluctuates in size"],
["Infantile", "Tunica + processus patent (without IP connection)", "Does not fluctuate; goes up to inguinal region; transilluminates"],
["Encysted hydrocele of cord", "Isolated cyst on spermatic cord", "Smooth, oval, separate from testis, moves with traction on testis"],
["Secondary", "Due to epididymo-orchitis, TB, tumour, trauma", "Turbid/bloody fluid; testis palpable in early stage"],
]
story.append(two_col_table(["Type", "Mechanism", "Clinical Features"],
hydrocele_types, [3.5*cm, 5*cm, None]))
story.append(Spacer(1,6))
story += section_bar("7.4 DIFFERENTIAL DIAGNOSIS OF SCROTAL SWELLINGS")
diff_scrotum = [
["Hydrocele", "YES", "NO", "YES", "Soft, fluctuant"],
["Epididymal cyst", "YES", "YES", "YES", "Superior to testis"],
["Testicular tumour", "YES", "NO", "NO", "Hard, irregular"],
["Haematocele", "YES", "NO", "NO", "Post-trauma, tense"],
["Epididymo-orchitis", "YES", "Tender", "NO", "Hot, tender, fever"],
["Varicocele", "YES", "YES (bag of worms)", "NO", "Disappears supine"],
["Inguinal hernia", "NO", "YES — bowel sounds", "NO", "Reducible, cough impulse"],
]
story.append(two_col_table(
["Condition", "Get above", "Separate testis", "Transilluminates", "Key Feature"],
diff_scrotum, [3.5*cm, 2cm, 2.5*cm, 3*cm, None]))
story.append(Spacer(1,6))
story.append(PageBreak())
# ─── CHAPTER 8: COMMON SWELLINGS ────────────────────────────────────────────
def ch8_swellings(story):
story += chapter_header("8", "COMMON SWELLINGS — CLINICAL EXAMINATION", MED_BLUE)
story += source_box(SOURCES)
story += section_bar("8.1 FRAMEWORK — 10 CHARACTERISTICS OF ANY SWELLING (Das)")
sw_chars = [
["1. Site", "Anatomical region, depth (skin/subcutaneous/deep), relation to structures"],
["2. Size", "Length x Breadth x Depth in cm (or diameter)"],
["3. Shape", "Spherical, hemispherical, lobulated, irregular"],
["4. Surface", "Smooth, nodular, bosselated, irregular"],
["5. Edge/Margin", "Well-defined (benign), ill-defined (infiltrating malignancy)"],
["6. Consistency", "Soft, firm, hard, cystic, fluctuant, bony hard"],
["7. Tenderness", "Tender = inflammatory, abscess; non-tender = cystic/malignant"],
["8. Mobility/Fixity", "Mobile: all directions, or along one axis (nerve sheath tumour)"],
["9. Transillumination", "Positive = clear cyst fluid (cystic hygroma, epididymal cyst)"],
["10. Pulsatility", "Transmitted vs expansile; bruit (AVM, vascular tumour)"],
]
story.append(two_col_table(["Characteristic", "What to Assess"],
sw_chars, [3.5*cm, None]))
story.append(Spacer(1,6))
swellings = [
("8.2 SEBACEOUS CYST (Epidermoid Cyst)",
["Attached to skin (test by pinching skin over cyst — moves with skin)",
"Punctum visible (blocked sebaceous duct opening) — pathognomonic",
"Smooth, rounded, well-defined edge",
"Soft to firm consistency, cheesy contents",
"NOT transilluminant",
"NOT attached to underlying structures",
"Complications: infection/abscess, horn formation (calcification in punctum)"],
"Punctum = sebaceous cyst. No punctum = dermoid cyst / lipoma."),
("8.3 LIPOMA",
["Soft, fluctuant, lobulated surface",
"SLIPPING SIGN (sign of Hamida): on palpating the edge, finger slips off due to smooth capsule under skin",
"Compressible but NOT reducible",
"NOT attached to overlying skin",
"NOT transilluminant (fat is opaque)",
"Pseudo-fluctuation present (soft consistency mimics fluid)",
"Intramuscular lipoma: hard, becomes harder on muscle contraction"],
"Slipping sign + non-attachment to skin + lobulated = lipoma. "
"Rapidly growing lipoma in elderly = liposarcoma until proved otherwise."),
("8.4 DERMOID CYST",
["Subcutaneous, smooth, rounded, well-defined",
"No punctum (cf. sebaceous cyst)",
"Types: Implantation (post-traumatic, usually finger pulp), Sequestration (at embryonic fusion lines — external angular, post-auricular, sublingual), Teratomatous",
"External angular dermoid: outer angle of orbit — does NOT move with eye",
"Doughy consistency (mixture of sebum, hair, teeth, epithelial debris)",
"NOT transilluminant"],
"External angular dermoid = common MS surgery case. No punctum, outer eye angle, doughy."),
("8.5 GANGLION",
["Dorsum of wrist (most common) / volar wrist / foot",
"Cystic, transilluminant",
"Attached to underlying joint capsule or tendon sheath",
"Fluctuant, smooth",
"Transilluminates in bright light",
"Becomes more prominent with wrist flexion (dorsal ganglion)",
"Non-tender unless secondarily inflamed"],
"Ganglion = cystic mucinous degeneration of joint capsule. "
"Transillumination + dorsum of wrist = classic. Can be aspirated or excised."),
("8.6 LYMPH NODE SWELLING",
["Site: cervical (anterior/posterior), axillary, inguinal, para-aortic (not palpable unless enlarged)",
"Multiple groups = systemic disease (lymphoma, leukaemia, TB, HIV)",
"Single group = local/regional cause",
"Matted (TB), rubbery/firm (lymphoma), hard irregular (metastatic carcinoma)",
"Warm, tender = reactive/infective; non-tender, firm = lymphoma/mets",
"Look for primary: examine head/neck for scalp lesions → anterior cervical; oral cavity, thyroid → level VI",
"Virchow's node: left supraclavicular = GI/thoracic primary (Troisier's sign)"],
"Always examine the drainage territory of the lymph node group for primary. "
"Biopsy strategy: FNA first, then core biopsy / excision if needed."),
("8.7 ABSCESS",
["Tender, warm, red swelling",
"Fluctuation: present in 2 planes (test with index and middle finger on 2 sides, flick with third finger — transmitted impulse = fluid)",
"Pseudo-fluctuation (lipoma) vs true fluctuation",
"Acute: hot, tense, painful; minimal fluctuation early",
"Pointing abscess: skin thins, discolouration at centre",
"Collar-stud abscess: deep and superficial components connected through a narrow neck (TB)"],
"Fluctuation in 2 planes = free fluid = abscess. Incise and drain — do NOT aspirate alone."),
("8.8 NEUROFIBROMA",
["Soft, smooth, well-defined lump along nerve course",
"Movement perpendicular to nerve = POSITIVE (can move side to side)",
"Movement along nerve = NEGATIVE (cannot move in direction of nerve)",
"Tingling/pain on pressure = nerve origin tumour",
"Multiple = Neurofibromatosis (NF1: >6 cafe-au-lait spots, Lisch nodules; NF2: bilateral acoustic neuromas)",
"Bag of worms: plexiform neurofibroma"],
"Neurofibroma = moves perpendicular to nerve, NOT along nerve. "
"Multiple + cafe-au-lait = NF1."),
]
for title, items, keynote in swellings:
story += section_bar(title)
for it in items:
story.append(bul(it))
story.append(note(keynote))
story.append(Spacer(1,5))
story.append(PageBreak())
# ─── CHAPTER 9: ULCER ───────────────────────────────────────────────────────
def ch9_ulcer(story):
story += chapter_header("9", "ULCER — CLINICAL EXAMINATION", ACCENT)
story += source_box(SOURCES)
story += section_bar("9.1 DEFINITION")
story += body("An ulcer is a break in the continuity of an epithelial surface (skin or mucous membrane) which fails to heal spontaneously. (Das)")
story += section_bar("9.2 HISTORY")
ulcer_hx = [
["Site", "Lower limb (vascular/neuropathic), perineum (hidradenitis), oral cavity (aphthous/carcinoma)"],
["Duration", "Acute (<2 weeks) vs chronic (>2 weeks)"],
["Onset", "Spontaneous vs post-traumatic"],
["Pain", "Painful = arterial/inflammatory; painless = neuropathic (DM, leprosy, tabes dorsalis)"],
["Progression", "Healing vs enlarging (malignant transformation)"],
["Discharge", "Serous (healing), purulent (infected), bloody (Marjolin's)"],
["Systemic", "DM, PVD, immunosuppression, steroids, malignancy"],
["Occupation/travel", "Tropical ulcer, Buruli ulcer"],
]
story.append(two_col_table(["Feature", "Points to Elicit"], ulcer_hx, [3.5*cm, None]))
story.append(Spacer(1,6))
story += section_bar("9.3 EXAMINATION — 7 CHARACTERISTICS OF AN ULCER (Das)")
seven_chars = [
["1. Site", "Anatomical region; relation to bony prominences, pressure areas"],
["2. Size", "Length x Breadth in cm; depth (probe gently with gloved finger)"],
["3. Shape", "Round (rodent/BCC), irregular, serpiginous, punched-out (syphilitic, ischaemic)"],
["4. Edge", "See table below for types"],
["5. Floor", "Granulation tissue (healthy/unhealthy), slough, necrotic tissue, exposed tendon/bone"],
["6. Base", "Structure on which floor lies — bone, muscle, fascia, artery"],
["7. Discharge", "Serous, serosanguineous, purulent, haemorrhagic; quantity; odour"],
]
story.append(two_col_table(["Characteristic", "What to Assess & Clinical Significance"],
seven_chars, [3.5*cm, None]))
story.append(Spacer(1,6))
story += section_bar("9.4 TYPES OF ULCER EDGE (CRITICAL)")
edges = [
["Sloping/Shelving edge", "HEALING ulcer (flat saucer-shaped edge sloping towards centre)", "Traumatic, healing venous ulcer"],
["Punched-out edge", "Perpendicular 90° edges — like a punch-hole", "Syphilitic (gumma), ischaemic/arterial, trophic (neuropathic)"],
["Undermined edge", "Edge overhangs floor — TB ulcer", "Tuberculous ulcer (cold abscess discharge)"],
["Rolled/Everted edge", "Edge rolls outward over skin", "Squamous cell carcinoma (malignant)"],
["Raised/Pearly/Rolled edge", "Pearly white, rolled, beaded", "Basal cell carcinoma (rodent ulcer)"],
["Raised (proliferative)", "Everted, cauliflower growth at edge", "Carcinoma (advanced)"],
]
story.append(two_col_table(["Edge Type", "Description", "Indicates"],
edges, [4*cm, 6*cm, None]))
story.append(Spacer(1,6))
story.append(note("MNEMONICS — Edges: 'Punched out = syphilis/ischaemia; Undermined = TB; "
"Everted/Rolled = SCC; Pearly rolled = BCC; Sloping = healing.'"))
story += section_bar("9.5 ARTERIAL vs VENOUS vs NEUROPATHIC ULCER")
avnp = [
["Site", "Tips of toes, heel, pressure points", "Gaiter area (medial malleolus)", "Pressure points (heel, metatarsal heads, malleoli)"],
["Pain", "Very painful (rest pain)", "Aching, relieved by elevation", "PAINLESS"],
["Edge", "Punched-out", "Sloping", "Punched-out / callus rim"],
["Floor", "Pale, grey, necrotic", "Pink granulation tissue", "May see deep structures"],
["Base", "Tendon/bone exposed", "Usually soft tissue", "Bone in osteomyelitis"],
["Surrounding skin", "Pale, cold, hairless", "Pigmented, lipodermatosclerosis", "Warm (neuropathic), Charcot changes"],
["Pulses", "Absent/reduced", "Present", "Present (autonomic neuropathy)"],
["ABI", "<0.5", "Normal (0.9-1.3)", "Normal or >1.3 (calcified)"],
["Oedema", "Usually absent", "Prominent ankle oedema", "May be present"],
["Cause", "Atherosclerosis, embolism, Buerger's", "Chronic venous hypertension", "DM, leprosy, tabes dorsalis, spina bifida"],
]
story.append(two_col_table(
["Feature", "Arterial", "Venous", "Neuropathic"],
avnp, [3*cm, 4*cm, 4*cm, None]))
story.append(Spacer(1,6))
story += section_bar("9.6 MARJOLIN'S ULCER")
for t in [
"Definition: Malignant (SCC) transformation of a chronic benign ulcer or scar",
"Latent period: 20–30 years (average) after original injury",
"Typical sites: leg ulcer, burn scar (Marjolin's burn ulcer), chronic sinus",
"Features suggesting malignant change:",
]:
story.append(bul(t))
for t in [
"Increasing size of ulcer despite treatment",
"Change in character — raised, everted edges",
"Profuse, offensive discharge",
"Indurated base with bleeding granulations",
"Rarely metastasises early (scar has no lymphatics — initially) → late lymph node spread",
]:
story.append(bul(t, level=2))
story.append(note("Marjolin's ulcer: SCC arising in scar/chronic ulcer. "
"Paradox: late lymph node spread (scar avascular → no lymphatics). "
"Biopsy ALL chronic non-healing ulcers. (Das, Shah)"))
story += section_bar("9.7 SPECIAL TESTS FOR ULCER")
ulcer_special = [
("Probe Test",
["Gently probe the base of the ulcer with a sterile blunt probe.",
"Feel depth, direction, and tissue at base.",
"Probe-to-bone = osteomyelitis.",
"Sinuses can be probed for direction and communication."],
"Probe to bone in diabetic foot = osteomyelitis with ~89% specificity. (Das)"),
("Biopsy of Ulcer Edge",
["Take biopsy from the edge (not centre — necrotic/slough).",
"Include edge and floor tissue.",
"Site: Junction of ulcer edge and surrounding skin.",
"Send for histopathology (and culture if infective suspected)."],
"Biopsy from the EDGE of an ulcer — not the floor. "
"Centre has necrosis/slough. Edge shows active cellular proliferation."),
]
for name, steps, keynote in ulcer_special:
story += subsec(name)
for i, s in enumerate(steps, 1):
story.append(bul(f"Step {i}: {s}"))
story.append(note(keynote))
story.append(Spacer(1,4))
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════════════════
# BUILD
# ════════════════════════════════════════════════════════════════════════════
def build():
story = []
cover(story)
toc(story)
ch1_pvd(story)
ch2_breast(story)
ch3_thyroid(story)
ch4_abdlump(story)
ch5_vv(story)
ch6_hernia(story)
ch7_hydrocele(story)
ch8_swellings(story)
ch9_ulcer(story)
# --- Build with two page templates: cover + normal ---
cover_frame = Frame(0, 0, A4[0], A4[1], leftPadding=0, rightPadding=0,
topPadding=0, bottomPadding=0)
normal_frame = Frame(1.8*cm, 1.5*cm, A4[0]-3.6*cm, A4[1]-3.5*cm,
leftPadding=0, rightPadding=0,
topPadding=0, bottomPadding=0)
cover_template = PageTemplate(id='cover', frames=[cover_frame],
onPage=cover_page_cb)
normal_template = PageTemplate(id='normal', frames=[normal_frame],
onPage=header_footer)
doc = BaseDocTemplate(
OUTPUT,
pagesize=A4,
pageTemplates=[cover_template, normal_template],
title="MS General Surgery Clinical Examination Guide",
author="S. Das | Makhan Lal Shah",
)
# Insert NextPageTemplate before first story element
from reportlab.platypus import NextPageTemplate
final_story = [NextPageTemplate('cover')] + story[:1] + \
[NextPageTemplate('normal')] + story[1:]
doc.build(final_story)
print(f"PDF saved: {OUTPUT}")
if __name__ == "__main__":
build()
cd /home/daytona/workspace/surgery-classifications && python3 clinical_exam_guide.py 2>&1
~/surgery-classifications/clinical_exam_guide.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/surgery-classifications/clinical_exam_guide.py'
cd /home/daytona/workspace/surgery-classifications && python3 clinical_exam_guide.py 2>&1
~/surgery-classifications/clinical_exam_guide.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/surgery-classifications/clinical_exam_guide.py'
cd /home/daytona/workspace/surgery-classifications && python3 clinical_exam_guide.py 2>&1
ls -lh /home/daytona/workspace/surgery-classifications/MS_Surgery_Clinical_Exam_Guide.pdf
MS Surgery Clinical Exam Guide
PDF Document · PDF
| Chapter | Topic | Key Content |
|---|---|---|
| 1 | Peripheral Vascular Disease | History, arterial/venous examination, Buerger's test, ABI, Allen's, capillary refill, Trendelenburg, Perthe's, Schwartz, Morrissey |
| 2 | Breast | History, 4-position inspection, 10 characteristics of lump, skin tethering, nipple discharge table, 5 axillary node groups, Paget's test, pectoral fixation |
| 3 | Thyroid | History, swallowing test, tongue protrusion, palpation points, Berry's sign, Pemberton's sign, Kocher's test, Crile's test |
| 4 | Abdominal Lump | History, 10 characteristics, liver/spleen/kidney palpation, Carnett's test, shifting dullness, fluid thrill, transillumination, Murphy's sign |
| 5 | Varicose Veins | CEAP classification, Trendelenburg (both parts), Tourniquet test, Perthe's test (contraindication), Schwartz, Morrissey cough impulse |
| 6 | Hernia | Direct vs indirect table, Zieman's test (finger positions), inguinal vs femoral table, invagination test, deep ring occlusion test |
| 7 | Hydrocele | "Can you get above?" framework, transillumination, 5 types of hydrocele, differential diagnosis table |
| 8 | Common Swellings | 10 characteristics framework, sebaceous cyst (punctum), lipoma (slipping sign), dermoid, ganglion, lymph node, abscess (fluctuation), neurofibroma |
| 9 | Ulcer | 7 characteristics, 6 edge types with mnemonics, arterial/venous/neuropathic comparison table, Marjolin's ulcer, probe test |