~/pharma-notes/generate_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import mm
from reportlab.lib import colors
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, PageBreak, KeepTogether
)
from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_JUSTIFY
from reportlab.platypus import BalancedColumns
OUTPUT = "/home/daytona/workspace/pharma-notes/General_Pharmacology_Revision.pdf"
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
rightMargin=15*mm,
leftMargin=15*mm,
topMargin=15*mm,
bottomMargin=15*mm,
)
W = A4[0] - 30*mm # usable width
# ── Color palette ──────────────────────────────────────────────
NAVY = colors.HexColor("#1a3a5c")
TEAL = colors.HexColor("#0d7a7a")
ORANGE = colors.HexColor("#e05a00")
YELLOW = colors.HexColor("#fff3b0")
LBLUE = colors.HexColor("#dff0fa")
LGREEN = colors.HexColor("#e8f8e8")
LPEACH = colors.HexColor("#fff0e6")
GREY = colors.HexColor("#f4f4f4")
RED = colors.HexColor("#c0392b")
LTEAL = colors.HexColor("#e0f5f5")
WHITE = colors.white
BLACK = colors.black
# ── Styles ─────────────────────────────────────────────────────
styles = getSampleStyleSheet()
def S(name, **kw):
return ParagraphStyle(name, **kw)
TITLE_S = S("TitleS", fontSize=22, textColor=WHITE, alignment=TA_CENTER,
fontName="Helvetica-Bold", spaceAfter=2)
SUB_S = S("SubS", fontSize=11, textColor=WHITE, alignment=TA_CENTER,
fontName="Helvetica", spaceAfter=0)
H1 = S("H1", fontSize=13, textColor=WHITE, fontName="Helvetica-Bold",
spaceBefore=6, spaceAfter=3, leading=16)
H2 = S("H2", fontSize=11, textColor=NAVY, fontName="Helvetica-Bold",
spaceBefore=5, spaceAfter=2, leading=14)
H3 = S("H3", fontSize=10, textColor=TEAL, fontName="Helvetica-Bold",
spaceBefore=4, spaceAfter=2, leading=13)
BODY = S("Body", fontSize=8.5, fontName="Helvetica",
spaceBefore=1, spaceAfter=1, leading=12, textColor=BLACK)
BODY_B = S("BodyB", fontSize=8.5, fontName="Helvetica-Bold",
spaceBefore=1, spaceAfter=1, leading=12, textColor=BLACK)
SMALL = S("Small", fontSize=7.5, fontName="Helvetica",
spaceBefore=0, spaceAfter=0, leading=11, textColor=BLACK)
MN_TITLE = S("MnTitle", fontSize=11, fontName="Helvetica-Bold",
textColor=ORANGE, spaceBefore=4, spaceAfter=2)
MN_BODY = S("MnBody", fontSize=9, fontName="Helvetica",
spaceBefore=1, spaceAfter=1, leading=13, textColor=BLACK)
STAR = S("Star", fontSize=8.5, fontName="Helvetica-Bold",
textColor=RED, spaceBefore=1, spaceAfter=1, leading=12)
story = []
# ══════════════════════════════════════════════════════════════
# Helper utilities
# ══════════════════════════════════════════════════════════════
def banner(text, sub="", bg=NAVY):
data = [[Paragraph(text, TITLE_S)]]
if sub:
data.append([Paragraph(sub, SUB_S)])
t = Table(data, colWidths=[W])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("ROUNDEDCORNERS", [6,6,6,6]),
("TOPPADDING", (0,0), (-1,-1), 10),
("BOTTOMPADDING", (0,0), (-1,-1), 10),
("LEFTPADDING", (0,0), (-1,-1), 12),
]))
return t
def section_header(text, bg=NAVY):
t = Table([[Paragraph(text, H1)]], colWidths=[W])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("ROUNDEDCORNERS",[4,4,4,4]),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 10),
]))
return t
def mnemonic_box(title, content_lines, bg=YELLOW):
rows = [[Paragraph(f"🔑 {title}", MN_TITLE)]]
for line in content_lines:
rows.append([Paragraph(line, MN_BODY)])
t = Table(rows, colWidths=[W])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("BACKGROUND", (0,0), (0,0), colors.HexColor("#fffae0")),
("BOX", (0,0), (-1,-1), 1, ORANGE),
("LINEBELOW", (0,0), (0,0), 1, ORANGE),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 10),
("ROUNDEDCORNERS",[4,4,4,4]),
]))
return t
def highlight_box(text, bg=LBLUE):
t = Table([[Paragraph(text, BODY)]], colWidths=[W])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("BOX", (0,0), (-1,-1), 0.5, TEAL),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 10),
("ROUNDEDCORNERS",[3,3,3,3]),
]))
return t
def two_col_table(headers, rows, col_w=None, header_bg=TEAL):
if col_w is None:
col_w = [W/len(headers)] * len(headers)
data = [[Paragraph(f"<b>{h}</b>", S("th", fontSize=8.5, fontName="Helvetica-Bold",
textColor=WHITE, leading=12)) for h in headers]]
for row in rows:
data.append([Paragraph(str(c), SMALL) for c in row])
t = Table(data, colWidths=col_w, repeatRows=1)
style = [
("BACKGROUND", (0,0), (-1,0), header_bg),
("ROWBACKGROUNDS",(0,1), (-1,-1), [WHITE, GREY]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#cccccc")),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "TOP"),
]
t.setStyle(TableStyle(style))
return t
def bullet(text, indent=10):
return Paragraph(f"<bullet>•</bullet> {text}",
S("bul", fontSize=8.5, fontName="Helvetica",
leftIndent=indent, spaceBefore=1, spaceAfter=1,
leading=12, bulletIndent=indent-8))
def subbullet(text):
return Paragraph(f"<bullet>–</bullet> {text}",
S("sbul", fontSize=8, fontName="Helvetica",
leftIndent=20, spaceBefore=0, spaceAfter=0,
leading=11, bulletIndent=12))
def sp(h=4):
return Spacer(1, h)
def p(text, style=BODY):
return Paragraph(text, style)
def hr():
return HRFlowable(width=W, thickness=0.5, color=colors.HexColor("#cccccc"),
spaceAfter=4, spaceBefore=4)
# ══════════════════════════════════════════════════════════════
# PAGE 1 – COVER
# ══════════════════════════════════════════════════════════════
story.append(Spacer(1, 30*mm))
story.append(banner("GENERAL PHARMACOLOGY",
"Quick Revision Notes with Mnemonics", bg=NAVY))
story.append(sp(8))
cover_info = [
["Source:", "Shanbhag Pharmacology for Medical Graduates"],
["Topic:", "Pharmacokinetics & Pharmacodynamics (ADME + Mechanisms)"],
["Purpose:", "Exam-Oriented Rapid Revision"],
]
ct = Table(cover_info, colWidths=[35*mm, W-35*mm])
ct.setStyle(TableStyle([
("FONTNAME", (0,0), (0,-1), "Helvetica-Bold"),
("FONTNAME", (1,0), (1,-1), "Helvetica"),
("FONTSIZE", (0,0), (-1,-1), 9.5),
("TEXTCOLOR", (0,0), (0,-1), TEAL),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LINEBELOW", (0,0), (-1,-1), 0.3, colors.lightgrey),
]))
story.append(ct)
story.append(sp(12))
# Contents box
toc_items = [
"1. Membrane Transport Mechanisms",
"2. Drug Absorption & Bioavailability",
"3. Drug Distribution & Vd",
"4. Plasma Protein Binding",
"5. Biotransformation (Phase I & II)",
"6. Drug Excretion",
"7. Pharmacokinetic Parameters (t½, Clearance, Kinetics)",
"8. TDM & Fixed-Dose Combinations",
"9. Pharmacodynamics – Mechanisms of Action",
"10. Receptor Families & Regulation",
"11. Dose-Response Relationship",
"12. Drug Interactions",
"13. Adverse Drug Reactions & Hypersensitivity",
"14. Drug Dependence & Teratogenicity",
"15. Treatment of Poisoning & Antidotes",
"16. MASTER MNEMONIC SHEET",
"17. HIGH-YIELD TABLES",
]
toc_data = [[p(f"<b>CONTENTS</b>", H2)]] + [[p(item, SMALL)] for item in toc_items]
toc_t = Table(toc_data, colWidths=[W])
toc_t.setStyle(TableStyle([
("BACKGROUND", (0,0), (0,0), LBLUE),
("BACKGROUND", (0,1), (0,-1), WHITE),
("BOX", (0,0), (-1,-1),1, TEAL),
("LINEBELOW", (0,0), (0,0), 1, TEAL),
("TOPPADDING", (0,0), (-1,-1), 3),
("BOTTOMPADDING", (0,0), (-1,-1), 3),
("LEFTPADDING", (0,0), (-1,-1), 12),
]))
story.append(toc_t)
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════
# SECTION 1 – MEMBRANE TRANSPORT
# ══════════════════════════════════════════════════════════════
story.append(section_header("1. MEMBRANE TRANSPORT MECHANISMS"))
story.append(sp(4))
story.append(two_col_table(
["Mechanism", "Key Features", "Energy", "Example"],
[
["Passive diffusion", "High→Low conc; most drugs; lipid-soluble", "No", "Most oral drugs"],
["Active transport", "Low→High conc; against gradient", "Yes (ATP)", "Levodopa, sympathomimetic amines"],
["Facilitated diffusion", "Carrier-mediated; High→Low", "No", "Glucose via GLUT4"],
["Filtration", "Depends on molecular size/weight", "No", "Small molecules through pores"],
["Endocytosis", "Cell engulfs drug via vesicle", "No", "Vit B12–intrinsic factor complex"],
],
col_w=[38*mm, 65*mm, 18*mm, 52*mm]
))
story.append(sp(6))
story.append(mnemonic_box("MNEMONIC: Membrane Transport – PAFFE",
["<b>P</b>assive diffusion",
"<b>A</b>ctive transport",
"<b>F</b>acilitated diffusion",
"<b>F</b>iltration",
"<b>E</b>ndocytosis"]))
story.append(sp(6))
# ══════════════════════════════════════════════════════════════
# SECTION 2 – DRUG ABSORPTION & BIOAVAILABILITY
# ══════════════════════════════════════════════════════════════
story.append(section_header("2. DRUG ABSORPTION & BIOAVAILABILITY"))
story.append(sp(4))
story.append(p("<b>Drug Absorption</b> = Movement of drug from site of administration into blood", H3))
story.append(sp(3))
story.append(p("<b>Factors Influencing Absorption – Physicochemical:</b>", BODY_B))
story.append(bullet("Liquid > Solid; Lipid-soluble & unionized > water-soluble & ionized"))
story.append(bullet("Smaller particle size = better absorption (microfine aspirin, digoxin, griseofulvin)"))
story.append(bullet("Shorter disintegration/dissolution time = better absorption"))
story.append(bullet("Calcium reduces tetracycline absorption (binding agent)"))
story.append(sp(3))
story.append(p("<b>pH and Ionization (KEY CONCEPT):</b>", BODY_B))
story.append(two_col_table(
["Drug Type", "Absorbed Better From", "Examples"],
[
["Weakly ACIDIC (pKa 4-6)", "STOMACH (acidic pH → unionized)", "Barbiturates, salicylates, warfarin"],
["Weakly BASIC (pKa 8-10)", "INTESTINE (alkaline pH → unionized)", "Morphine, amphetamine, atropine"],
["Strongly acidic/basic", "Poorly absorbed at any pH", "Heparin (strongly acidic), aminoglycosides (strongly basic)"],
],
col_w=[42*mm, 60*mm, 71*mm]
))
story.append(sp(4))
story.append(mnemonic_box("MNEMONIC: 'Acid in Acid, Base in Base'",
["Weakly <b>Acid</b>ic drugs → absorbed from <b>acid</b>ic stomach",
"Weakly <b>Bas</b>ic drugs → absorbed from alkal<b>ine</b> intestine (bas-ine = basic → intestine)",
"<i>Think: 'Like dissolves like – unionized form crosses membrane'</i>"]))
story.append(sp(4))
story.append(p("<b>Bioavailability</b> = Fraction of drug reaching systemic circulation", BODY_B))
story.append(bullet("IV route = 100% bioavailability (gold standard)"))
story.append(bullet("Bioequivalent = two formulations produce equal bioavailability"))
story.append(sp(3))
story.append(p("<b>10 Factors Affecting Bioavailability:</b>", BODY_B))
story.append(mnemonic_box("MNEMONIC: 'PRP-FAGE-HE' (10 factors)",
["<b>P</b>hysicochemical properties",
"<b>R</b>oute of administration",
"<b>P</b>H and ionization",
"<b>F</b>ood",
"<b>A</b>rea of absorbing surface",
"<b>G</b>I and other diseases",
"<b>E</b>nterophepatic cycling",
"<b>H</b>epatic diseases",
"<b>E</b>nzyme (First-pass) metabolism",
"+ Presence of other drugs"]))
story.append(sp(4))
story.append(p("<b>First-Pass Metabolism (Presystemic Elimination):</b>", BODY_B))
story.append(highlight_box(
"Oral drug → gut wall → portal vein → LIVER → systemic circulation<br/>"
"Result: Decreased bioavailability | Examples: <b>Lignocaine, Isoprenaline, Propranolol, Nitroglycerin</b><br/>"
"Clinical use: Lignocaine given IV for ventricular arrhythmias (bypasses first-pass)"))
story.append(sp(3))
story.append(p("<b>Enterohepatic Cycling:</b> Drug excreted via bile → reabsorbed from intestine → liver → bile", BODY))
story.append(p("↑ Bioavailability and ↑ duration of action | Examples: <b>Morphine, Doxycycline</b>", BODY))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════
# SECTION 3 – DRUG DISTRIBUTION
# ══════════════════════════════════════════════════════════════
story.append(section_header("3. DRUG DISTRIBUTION & APPARENT VOLUME OF DISTRIBUTION (aVd)"))
story.append(sp(4))
story.append(p("<b>Body Fluid Compartments (70 kg person):</b>", BODY_B))
bf_data = [
[p("<b>Compartment</b>", BODY_B), p("<b>Volume</b>", BODY_B), p("<b>Drugs Distributed</b>", BODY_B)],
[p("Total Body Water (TBW)", BODY), p("42 L", BODY), p("Ethanol, small water-soluble molecules", BODY)],
[p("Extracellular Fluid (ECF)", BODY), p("14 L", BODY), p("Gentamicin, streptomycin", BODY)],
[p("Plasma", BODY), p("3 L", BODY), p("Heparin, warfarin (large MW/protein-bound)", BODY)],
[p("Intracellular Fluid (ICF)", BODY), p("28 L", BODY), p("Lipid-soluble drugs", BODY)],
]
bft = Table(bf_data, colWidths=[55*mm, 25*mm, W-80*mm])
bft.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), TEAL),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("ROWBACKGROUNDS",(0,1), (-1,-1), [WHITE, GREY]),
("GRID", (0,0), (-1,-1), 0.4, colors.lightgrey),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 6),
]))
story.append(bft)
story.append(sp(5))
story.append(p("<b>aVd Formula:</b>", BODY_B))
story.append(highlight_box("<b>aVd = Total administered amount of drug ÷ Plasma concentration</b>"))
story.append(sp(3))
story.append(two_col_table(
["aVd Value", "Meaning", "Examples"],
[
["Low (~3-4 L)", "Restricted to vascular compartment (large MW or highly protein-bound)", "Heparin, Warfarin"],
["~14-16 L", "Distributed in ECF", "Gentamicin, Streptomycin"],
["~42 L", "Distributed in TBW", "Ethanol"],
["Very high (>1000 L)", "Accumulates extensively in tissues", "Chloroquine (13,000 L), Digoxin (500 L)"],
],
col_w=[30*mm, 90*mm, 53*mm]
))
story.append(sp(4))
story.append(mnemonic_box("KEY FACT: High aVd drugs",
["Haemodialysis is <b>NOT useful</b> for removal in overdose of high-aVd drugs (chloroquine, digoxin)",
"Drugs with high aVd accumulate in tissues – dialysis cannot 'pull' them back"]))
story.append(sp(4))
story.append(p("<b>Redistribution:</b> Thiopentone", H3))
story.append(highlight_box(
"Thiopentone IV → rapidly distributes to <b>brain</b> (high blood flow) → anaesthesia<br/>"
"Within minutes → redistributes to less-perfused <b>adipose tissue</b><br/>"
"Result: Very short duration of action (5–10 min) → used for <b>INDUCTION of general anaesthesia</b>"))
story.append(sp(4))
story.append(p("<b>Drug Reservoirs / Tissue Storage:</b>", BODY_B))
story.append(mnemonic_box("MNEMONIC: Drug Tissue Reservoirs – 'TeTCDiG'",
["<b>Te</b>tracyclines → <b>Bones and Teeth</b>",
"<b>T</b>hiopentone, DDT → <b>Adipose tissue</b>",
"<b>C</b>hloroquine → <b>Liver and Retina</b>",
"<b>Di</b>goxin → <b>Heart</b>",
"<b>G</b>old salts → <b>Skin and Kidneys</b>"]))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════
# SECTION 4 – PLASMA PROTEIN BINDING
# ══════════════════════════════════════════════════════════════
story.append(section_header("4. PLASMA PROTEIN BINDING"))
story.append(sp(4))
story.append(two_col_table(
["Drug Type", "Protein Bound To"],
[
["Acidic drugs (warfarin, phenytoin, NSAIDs)", "Albumin"],
["Basic drugs (propranolol, lidocaine, imipramine)", "α1-acid glycoprotein"],
],
col_w=[W/2, W/2]
))
story.append(sp(4))
story.append(p("<b>Clinical Importance of Plasma Protein Binding:</b>", BODY_B))
story.append(bullet("<b>Only FREE form</b> is pharmacologically active, crosses BBB, crosses placenta, filtered at glomerulus"))
story.append(bullet("Highly protein-bound → <b>low Vd</b>; delays metabolism; delays excretion (filtration)"))
story.append(bullet("Longer duration of action: Sulphadiazine (6 h, less bound) vs Sulphadoxine (1 week, highly bound)"))
story.append(bullet("<b>Hypoalbuminaemia</b> (liver failure, renal failure, malnutrition) → ↑ free drug → toxicity"))
story.append(bullet("<b>Displacement interaction:</b> Drug with higher affinity displaces drug with lower affinity"))
story.append(subbullet("Salicylates displace warfarin → sudden ↑ free warfarin → bleeding"))
story.append(bullet("In poisoning: hard to remove by haemodialysis (highly protein-bound)"))
story.append(sp(4))
story.append(mnemonic_box("MNEMONIC: Highly Protein-Bound Drugs – 'WAVED'",
["<b>W</b>arfarin",
"<b>A</b>miodarone",
"<b>V</b>alproate",
"<b>E</b>rythromycin",
"<b>D</b>iazepam, Digoxin",
"<i>Also: Sulphadoxine, Ibuprofen, Propranolol</i>"]))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════
# SECTION 5 – BIOTRANSFORMATION
# ══════════════════════════════════════════════════════════════
story.append(section_header("5. BIOTRANSFORMATION (Drug Metabolism)"))
story.append(sp(4))
story.append(highlight_box(
"<b>Main site: LIVER</b> | Others: GI tract, kidney, lungs, blood, skin, placenta<br/>"
"Converts lipid-soluble/unionized → water-soluble/ionized → renally excreted"))
story.append(sp(4))
story.append(p("<b>Types of Metabolic Transformation:</b>", BODY_B))
story.append(two_col_table(
["Type", "Example"],
[
["Active → INACTIVE metabolite (most common)", "Phenobarbitone → Hydroxyphenobarbitone; Phenytoin → p-Hydroxyphenytoin"],
["Active → ACTIVE metabolite", "Codeine → Morphine; Diazepam → Oxazepam"],
["Inactive (PRODRUG) → Active metabolite", "Levodopa → Dopamine; Prednisone → Prednisolone"],
],
col_w=[70*mm, W-70*mm]
))
story.append(sp(4))
story.append(p("<b>Prodrug Uses (MNEMONIC: BITS):</b>", H3))
story.append(mnemonic_box("MNEMONIC: Why use PRODRUGS? – 'BITS'",
["<b>B</b>ioavailability improvement: Levodopa → crosses BBB → becomes Dopamine",
"<b>I</b>mprove taste: Clindamycin palmitate (paediatric suspension)",
"<b>T</b>ime (prolong duration): Fluphenazine (ester) → longer action",
"<b>S</b>ite-specific delivery: Methenamine → Formaldehyde (urinary antiseptic in acidic urine)"]))
story.append(sp(5))
story.append(p("<b>PHASE I REACTIONS (Non-synthetic):</b>", H3))
story.append(two_col_table(
["Reaction", "Process", "Examples"],
[
["Oxidation (MOST COMMON)", "Add O₂ or remove H₂; by Cytochrome P450", "Phenytoin, Phenobarbitone, Propranolol, Paracetamol"],
["Reduction", "Remove O₂ or add H₂", "Chloramphenicol, Methadone"],
["Hydrolysis", "Breakdown by addition of water", "Esters: Procaine, Succinylcholine | Amides: Lignocaine"],
["Cyclization", "Straight chain → ring structure", "Proguanil"],
["Decyclization", "Breaking of ring structure", "Phenobarbitone, Phenytoin"],
],
col_w=[40*mm, 60*mm, W-100*mm]
))
story.append(sp(3))
story.append(highlight_box("Main enzyme: <b>CYP3A4/5</b> (>50% of drugs) | Others: CYP2D6, CYP2C9, CYP2E1, CYP2C19<br/>"
"<b>Hofmann Elimination:</b> Drug inactivated WITHOUT enzymes → Example: <b>Atracurium</b>"))
story.append(sp(5))
story.append(p("<b>PHASE II REACTIONS (Synthetic/Conjugation):</b>", H3))
story.append(two_col_table(
["Conjugation", "Enzyme", "Examples"],
[
["Glucuronidation (most common)", "UDP-glucuronosyl transferase", "Aspirin, Morphine, Paracetamol"],
["Acetylation", "N-acetyltransferase", "INH, Dapsone, Sulphonamides"],
["Sulphation", "Sulphotransferase", "Paracetamol, Methyldopa"],
["Methylation", "Transmethylase", "Adrenaline, Dopamine, Histamine"],
["Glutathione conjugation", "Glutathione transferase", "Paracetamol (toxic metabolite)"],
["Glycine conjugation", "Acyl CoA glycine transferase", "Salicylates"],
],
col_w=[50*mm, 65*mm, W-115*mm]
))
story.append(sp(4))
story.append(mnemonic_box("EXCEPTION: INH → Phase II BEFORE Phase I",
["Most drugs: Phase I → Phase II",
"<b>EXCEPTION: Isoniazid (INH)</b> → Acetylation (Phase II) first, then Phase I",
"Clinical significance: Fast acetylators of INH → need higher dose; Slow acetylators → peripheral neuritis"]))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════
# SECTION 5b – ENZYME INDUCTION/INHIBITION
# ══════════════════════════════════════════════════════════════
story.append(section_header("5b. ENZYME INDUCTION & INHIBITION"))
story.append(sp(4))
story.append(two_col_table(
["Feature", "Enzyme INDUCTION", "Enzyme INHIBITION"],
[
["Mechanism", "↑ synthesis of microsomal enzymes", "↓ activity of metabolizing enzymes"],
["Onset", "Slow (days to weeks)", "Rapid (immediate)"],
["Key Drugs", "Rifampicin, Phenytoin, Barbiturates, Carbamazepine, Griseofulvin", "Chloramphenicol, Ciprofloxacin, Erythromycin, Metronidazole, Ketoconazole"],
["Mnemonic", "'RPBCG' – Rifampicin, Phenytoin, Barbiturates, Carbamazepine, Griseofulvin", "'CCEM' – Chloramphenicol, Ciprofloxacin, Erythromycin, Metronidazole"],
],
col_w=[35*mm, 82*mm, 56*mm]
))
story.append(sp(4))
story.append(p("<b>Clinical Consequences of Enzyme Induction:</b>", BODY_B))
story.append(two_col_table(
["Drug Inducer", "Drug Affected", "Clinical Result"],
[
["Rifampicin", "OCP (oral contraceptives)", "Contraceptive FAILURE"],
["Rifampicin", "Warfarin", "↓ anticoagulant effect"],
["Phenytoin/Barbiturates", "Vitamin D metabolism", "Osteomalacia"],
["Barbiturates", "Porphyrin synthesis (ALA synthase)", "Porphyria precipitation"],
["Phenobarbitone", "Glucuronyl transferase (neonates)", "Resolves neonatal jaundice (bilirubin conjugated)"],
["Carbamazepine", "Itself", "Autoinduction → tolerance"],
["Enzyme inducers", "Paracetamol metabolism", "↑ toxic metabolite → hepatotoxicity"],
],
col_w=[42*mm, 50*mm, W-92*mm]
))
story.append(sp(4))
story.append(p("<b>Clinical Consequences of Enzyme Inhibition:</b>", BODY_B))
story.append(two_col_table(
["Inhibitor", "Drug Affected", "Clinical Result"],
[
["Erythromycin / Chloramphenicol", "Warfarin", "↑ plasma warfarin → BLEEDING"],
["Erythromycin", "Carbamazepine", "↑ carbamazepine toxicity"],
["Allopurinol", "6-Mercaptopurine (6-MP)", "↑ 6-MP toxicity (xanthine oxidase inhibited)"],
["Ketoconazole", "Cisapride, Terfenadine", "↑ plasma levels → cardiac arrhythmias"],
],
col_w=[55*mm, 55*mm, W-110*mm]
))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════
# SECTION 6 – DRUG EXCRETION
# ══════════════════════════════════════════════════════════════
story.append(section_header("6. DRUG EXCRETION"))
story.append(sp(4))
story.append(mnemonic_box("MNEMONIC: Routes of Excretion – 'KLFSBSM'",
["<b>K</b>idney (main route)",
"<b>L</b>ungs – volatile anaesthetics (ether, halothane, isoflurane, sevoflurane)",
"<b>F</b>aeces – purgatives (senna, cascara), tetracyclines (via bile)",
"<b>S</b>kin – arsenic, mercury",
"<b>B</b>ile – enterohepatic cycling (morphine, doxycycline)",
"<b>S</b>aliva – potassium iodide, phenytoin, metronidazole, lithium",
"<b>M</b>ilk – most drugs (avoid amiodarone during breastfeeding)"]))
story.append(sp(4))
story.append(p("<b>Renal Excretion Formula:</b>", BODY_B))
story.append(highlight_box(
"<b>Rate of renal excretion = Rate of filtration + Rate of secretion − Rate of reabsorption</b>"))
story.append(sp(4))
story.append(p("<b>pH-Dependent Excretion (KEY EXAM TOPIC):</b>", BODY_B))
story.append(two_col_table(
["Situation", "Urine Modification", "Drug Excreted", "Drug Used"],
[
["Salicylate / Barbiturate poisoning", "Alkalinize urine (NaHCO₃)", "Acidic drugs (unionized in acid urine → ionized in alkaline → excreted)", "Sodium bicarbonate"],
["Amphetamine / Quinidine poisoning", "Acidify urine (Vit C)", "Basic drugs (unionized in alkaline → ionized in acidic → excreted)", "Ascorbic acid (Vitamin C)"],
],
col_w=[42*mm, 38*mm, 72*mm, 21*mm]
))
story.append(sp(4))
story.append(p("<b>Active Tubular Secretion:</b>", BODY_B))
story.append(bullet("Probenecid competes for same tubular carrier as penicillin → blocks penicillin secretion → ↑ penicillin half-life"))
story.append(bullet("Used clinically in gonorrhoea treatment to prolong penicillin action"))
story.append(bullet("Salicylates interfere with methotrexate excretion → ↑ methotrexate toxicity"))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════
# SECTION 7 – PK PARAMETERS
# ══════════════════════════════════════════════════════════════
story.append(section_header("7. PHARMACOKINETIC PARAMETERS"))
story.append(sp(4))
story.append(p("<b>Plasma Half-Life (t½):</b>", H3))
story.append(highlight_box(
"<b>t½ = Time for plasma concentration to fall by 50%</b><br/>"
"Lignocaine: 1 hour | Aspirin: 4 hours<br/>"
"Drug ~completely eliminated after <b>4–5 half-lives</b><br/>"
"Steady state reached after <b>4–5 half-lives</b>"))
story.append(sp(4))
story.append(p("<b>First-Order vs Zero-Order Kinetics:</b>", H3))
story.append(two_col_table(
["Feature", "First-Order Kinetics", "Zero-Order Kinetics"],
[
["Amount eliminated", "Constant FRACTION per unit time", "Constant AMOUNT per unit time"],
["t½", "Constant (independent of dose)", "NOT constant (increases as dose increases)"],
["Rate ∝ to", "Plasma concentration", "Independent of plasma concentration"],
["Examples", "Most drugs (penicillin, morphine)", "Ethanol (10 mL/h), Phenytoin (high dose), Aspirin (high dose)"],
["Dose-toxicity risk", "Low (predictable)", "HIGH – small dose increase → large plasma rise → TOXICITY"],
],
col_w=[38*mm, 75*mm, 60*mm]
))
story.append(sp(4))
story.append(mnemonic_box("KEY FACT: Phenytoin & Aspirin – Saturation Kinetics",
["At LOW doses → first-order kinetics (safe)",
"At HIGH doses → plasma levels saturate enzymes → ZERO-ORDER kinetics",
"Risk: Small dose increase → disproportionately large ↑ in plasma concentration → TOXICITY",
"<b>Must monitor TDM for phenytoin!</b>"]))
story.append(sp(5))
story.append(p("<b>Steady-State Concentration:</b>", H3))
story.append(bullet("Constant dosing → plasma conc increases until amount in = amount out"))
story.append(bullet("Achieved after 4–5 half-lives"))
story.append(bullet("Loading dose = rapidly attain target plasma concentration (used when t½ is long)"))
story.append(bullet("Maintenance dose = dose eliminated per dosing interval (given to maintain steady state)"))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════
# SECTION 8 – TDM & FDC
# ══════════════════════════════════════════════════════════════
story.append(section_header("8. THERAPEUTIC DRUG MONITORING (TDM) & FIXED-DOSE COMBINATIONS"))
story.append(sp(4))
story.append(p("<b>TDM = Monitoring plasma drug concentration to optimize therapy</b>", BODY_B))
story.append(sp(3))
story.append(p("<b>Indications for TDM:</b>", BODY_B))
story.append(mnemonic_box("MNEMONIC: When to do TDM? – 'NARROW'",
["<b>N</b>arrow therapeutic index drugs: Lithium, Digoxin, Phenytoin, Aminoglycosides",
"<b>A</b>scertain patient compliance",
"<b>R</b>enal failure patients (aminoglycosides – nephrotoxicity/ototoxicity)",
"<b>R</b>andom wide interindividual variation: tricyclic antidepressants",
"<b>O</b>ff-response: No response to therapy without known reason",
"<b>W</b>orkup for drug poisoning – estimation of plasma drug concentration"]))
story.append(sp(4))
story.append(p("<b>TDM NOT Required When:</b>", BODY_B))
story.append(bullet("Clinical parameters available: BP (antihypertensives), blood sugar (antidiabetics), PT/INR (anticoagulants)"))
story.append(bullet("Drugs producing tolerance: opioids"))
story.append(bullet("Drug effect lasts longer than drug (omeprazole, aspirin on platelets)"))
story.append(sp(5))
story.append(p("<b>WHO-Approved Fixed-Dose Combinations (FDCs):</b>", BODY_B))
story.append(mnemonic_box("MNEMONIC: FDC Examples – 'LISTS'",
["<b>L</b>evodopa + Carbidopa → Parkinsonism",
"<b>I</b>NH + Rifampicin + Pyrazinamide + Ethambutol → TB",
"<b>S</b>ulphamethoxazole + Trimethoprim → Cotrimoxazole (antimicrobial)",
"<b>T</b>B: Ferrous sulphate + Folic acid → Anaemia of pregnancy",
"<b>S</b>ynergistic: Amoxicillin + Clavulanic acid → Augmentin"]))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════
# SECTION 9 – PHARMACODYNAMICS
# ══════════════════════════════════════════════════════════════
story.append(section_header("9. PHARMACODYNAMICS – MECHANISMS OF ACTION"))
story.append(sp(4))
story.append(highlight_box("<b>Pharmacodynamics = What the drug does to the body</b>"))
story.append(sp(4))
story.append(p("<b>NON-RECEPTOR Mechanisms:</b>", H3))
story.append(two_col_table(
["Mechanism", "Example", "Drug"],
[
["Physical – Osmosis", "Cerebral oedema, Glaucoma", "Mannitol"],
["Physical – Adsorption", "Poisoning treatment", "Activated charcoal"],
["Physical – Demulcent", "Sore throat", "Cough syrup"],
["Physical – Radioactivity", "Hyperthyroidism", "Radioactive iodine (I¹³¹)"],
["Chemical – Neutralization", "Peptic ulcer", "Antacids"],
["Chemical – Chelation", "Arsenic/copper poisoning", "BAL (dimercaprol), D-penicillamine"],
["Chemical – Chelation", "Iron poisoning", "Desferrioxamine"],
["Enzyme inhibition", "Gout (↓uric acid synthesis)", "Allopurinol (inhibits xanthine oxidase)"],
["Enzyme inhibition", "Hypertension, Heart failure", "ACE inhibitors"],
["Ion channel blockade", "Local anaesthesia", "Local anaesthetics (block Na+ channels)"],
["Antibody production", "Immunity", "Vaccines (BCG, oral polio)"],
["Transporter blockade", "Depression", "SSRIs (block 5-HT transporter)"],
["Tubulin binding", "Gout (acute)", "Colchicine (prevents neutrophil migration)"],
],
col_w=[50*mm, 50*mm, W-100*mm]
))
story.append(sp(4))
story.append(p("<b>RECEPTOR-MEDIATED Mechanisms:</b>", H3))
story.append(highlight_box(
"<b>Drug (D) + Receptor (R) ⇌ Drug-Receptor Complex → Response</b>"))
story.append(sp(3))
story.append(two_col_table(
["Term", "Definition", "Example"],
[
["Affinity", "Ability of drug to bind to receptor", "Higher affinity = lower dose needed"],
["Intrinsic activity", "Ability to produce pharmacological action after binding", "Agonist = 1; Antagonist = 0"],
["Agonist", "High affinity + HIGH intrinsic activity", "Morphine, Adrenaline, Acetylcholine"],
["Antagonist", "High affinity + ZERO intrinsic activity; blocks receptor", "Naloxone (opioid), Atropine (muscarinic)"],
["Partial agonist", "Binds receptor, produces LESS effect than full agonist", "Pindolol, Buprenorphine"],
["Inverse agonist", "Binds receptor, produces OPPOSITE effect to agonist", "β-carbolines at BZD receptor → anxiety"],
["Competitive antagonist", "Same site; reversible; overcome by ↑ agonist dose", "Atropine vs ACh; Naloxone vs Morphine"],
["Non-competitive antagonist", "Different site or irreversible; flattening of DRC", "Diazepam vs bicuculline; phenoxybenzamine"],
],
col_w=[38*mm, 80*mm, 55*mm]
))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════
# SECTION 10 – RECEPTOR FAMILIES
# ══════════════════════════════════════════════════════════════
story.append(section_header("10. RECEPTOR FAMILIES"))
story.append(sp(4))
story.append(two_col_table(
["Receptor Type", "Location", "Effector", "Examples", "Response Time"],
[
["Ligand-gated ion channels (Ionotropic)", "Membrane", "Ion channel", "Nicotinic, GABA-A, Glutamate", "Milliseconds"],
["G-protein coupled (GPCRs, Metabotropic)", "Membrane", "Channel or enzyme (via G protein)", "Muscarinic, Adrenergic, Opioid", "Seconds"],
["Transmembrane enzyme-linked", "Membrane", "Enzyme (tyrosine kinase)", "Insulin, EGF, Growth hormone receptors", "Minutes to hours"],
["Nuclear receptors", "Intracellular", "Gene transcription", "Steroids, Thyroid hormones, Vit A & D, Glucocorticoids", "Hours"],
],
col_w=[40*mm, 22*mm, 35*mm, 50*mm, 26*mm]
))
story.append(sp(4))
story.append(mnemonic_box("MNEMONIC: Receptor Types – 'LGEN'",
["<b>L</b>igand-gated ion channels (fastest – milliseconds)",
"<b>G</b>-protein coupled receptors (seconds)",
"<b>E</b>nzyme-linked receptors (minutes to hours)",
"<b>N</b>uclear receptors (slowest – hours)",
"<i>Speed: L > G > E > N</i>"]))
story.append(sp(4))
story.append(p("<b>GPCR Subtypes & Second Messengers:</b>", BODY_B))
story.append(two_col_table(
["G-protein", "Effect", "Receptor Examples"],
[
["Gs", "↑ Adenylyl cyclase → ↑ cAMP", "β1, β2-adrenergic receptors"],
["Gi", "↓ Adenylyl cyclase → ↓ cAMP", "α2-adrenergic receptors, M2 (cardiac)"],
["Gq", "Activates Phospholipase C → ↑ IP₃ + DAG", "M1, M3 muscarinic; α1-adrenergic"],
],
col_w=[20*mm, 85*mm, W-105*mm]
))
story.append(sp(4))
story.append(p("<b>Receptor Regulation:</b>", BODY_B))
story.append(two_col_table(
["DOWNREGULATION", "UPREGULATION"],
[
["Prolonged use of AGONISTS", "Prolonged use of ANTAGONISTS"],
["↓ Receptor number & sensitivity", "↑↑ Receptor number & sensitivity"],
["Example: Chronic salbutamol → ↓ β-adrenoceptor response → decreased effect in asthma", "Example: Stopping propranolol suddenly → supersensitivity to catecholamines → rebound tachycardia, angina, MI"],
["", "⚠ PROPRANOLOL MUST NOT BE STOPPED ABRUPTLY"],
],
col_w=[W/2, W/2]
))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════
# SECTION 11 – DOSE-RESPONSE
# ══════════════════════════════════════════════════════════════
story.append(section_header("11. DOSE-RESPONSE RELATIONSHIP"))
story.append(sp(4))
story.append(two_col_table(
["Term", "Definition", "Formula/Note"],
[
["Therapeutic Index (TI)", "Index of drug safety", "TI = LD₅₀ ÷ ED₅₀"],
["LD₅₀", "Dose lethal to 50% of population", "Lower LD₅₀ = more toxic"],
["ED₅₀", "Dose producing desired effect in 50%", "Lower ED₅₀ = more potent"],
["Drug Potency", "Amount of drug required for a given response", "Lower dose = more potent (morphine > pethidine as analgesic)"],
["Drug Efficacy (Emax)", "Maximum effect a drug can produce", "Morphine > aspirin as analgesic"],
["Therapeutic Range", "Concentration range: desired effect with minimal toxicity", "Between MEC and toxic level"],
],
col_w=[40*mm, 65*mm, W-105*mm]
))
story.append(sp(4))
story.append(mnemonic_box("KEY: Narrow TI Drugs – Require TDM – 'LPAD'",
["<b>L</b>ithium",
"<b>P</b>henytoin",
"<b>A</b>minoglycosides",
"<b>D</b>igoxin",
"<i>Also: Theophylline, Cyclosporine, Warfarin, Methotrexate</i>"]))
story.append(sp(4))
story.append(p("<b>Combined Effects of Drugs:</b>", H3))
story.append(two_col_table(
["Effect", "Definition", "Formula", "Example"],
[
["Additive", "Combined = sum of individual effects", "A+B = A+B", "Aspirin + Paracetamol"],
["Potentiation (supra-additive)", "Inactive drug enhances active drug", "A+B > A+B (B inactive alone)", "Carbidopa + Levodopa"],
["Synergism", "Combined > either drug alone", "A+B >> A, B separately", "Cotrimoxazole (SMX+TMP)"],
["Physical antagonism", "Opposite physical property", "-", "Activated charcoal adsorbs alkaloids"],
["Chemical antagonism", "Chemical neutralization", "-", "Antacids + gastric acid; chelating agents"],
["Physiological antagonism", "Opposite effects via different receptors", "-", "Adrenaline vs Histamine"],
["Competitive antagonism", "Same receptor; reversible; overcome by ↑ agonist", "Rightward parallel DRC shift", "Atropine vs ACh"],
["Non-competitive antagonism", "Different receptor site; NOT overcome by ↑ agonist", "Flattening of DRC", "Diazepam vs bicuculline"],
],
col_w=[35*mm, 55*mm, 28*mm, W-118*mm]
))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════
# SECTION 12 – DRUG INTERACTIONS
# ══════════════════════════════════════════════════════════════
story.append(section_header("12. DRUG INTERACTIONS"))
story.append(sp(4))
story.append(two_col_table(
["Interacting Drugs", "Mechanism", "Result", "Type"],
[
["Antacids + Tetracycline", "Chelation in gut → unabsorbable complex", "↓ Tetracycline absorption", "PK - Absorption"],
["Metoclopramide + Aspirin", "↑ Gastric emptying", "↑ Aspirin absorption", "PK - Absorption"],
["Salicylates + Warfarin", "Plasma protein displacement", "↑ Free warfarin → BLEEDING", "PK - Distribution"],
["Rifampicin + OCP", "Enzyme induction of OCP metabolism", "Contraceptive FAILURE", "PK - Metabolism"],
["Erythromycin + Carbamazepine", "Enzyme inhibition → ↓ carbamazepine metabolism", "↑ Carbamazepine toxicity", "PK - Metabolism"],
["Probenecid + Penicillin", "Blocks tubular secretion", "↑ Penicillin levels (beneficial)", "PK - Excretion"],
["Salicylates + Methotrexate", "Interferes with tubular secretion of MTX", "↑ MTX toxicity", "PK - Excretion"],
["Aminoglycosides + Amphotericin B", "Additive toxicity on kidney", "↑ Nephrotoxicity (harmful)", "PD"],
["Levodopa + Carbidopa", "Inhibit peripheral decarboxylase", "↑ CNS levodopa (beneficial)", "PD"],
["Phenytoin + Dextrose IV", "Physical incompatibility", "Precipitates! Use normal saline", "Pharmaceutical"],
["Gentamicin + Carbenicillin (same IV)", "Chemical incompatibility", "Loss of potency", "Pharmaceutical"],
],
col_w=[55*mm, 55*mm, 40*mm, 23*mm]
))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════
# SECTION 13 – ADRs
# ══════════════════════════════════════════════════════════════
story.append(section_header("13. ADVERSE DRUG REACTIONS & HYPERSENSITIVITY"))
story.append(sp(4))
story.append(two_col_table(
["Type", "Nature", "Examples"],
[
["Type A – Predictable (Augmented)", "Related to pharmacological action; dose-dependent; common", "Side effects, Secondary effects, Toxic effects"],
["Type B – Unpredictable (Bizarre)", "NOT related to pharmacological action; rare but serious", "Drug allergy, Idiosyncrasy"],
],
col_w=[50*mm, 80*mm, W-130*mm]
))
story.append(sp(4))
story.append(p("<b>Types of Hypersensitivity (Gell & Coombs Classification):</b>", BODY_B))
story.append(two_col_table(
["Type", "Mediator", "Time", "Manifestation", "Treatment"],
[
["I – Anaphylactic/Immediate", "IgE, Mast cells", "Minutes", "Itching, urticaria, asthma, anaphylactic shock", "Adrenaline, Hydrocortisone, Antihistamine"],
["II – Cytotoxic", "IgG, IgM", "Hours", "Blood transfusion reactions, haemolytic anaemia", "Glucocorticoids"],
["III – Immune complex (Serum sickness)", "IgG complexes", "Hours–days", "Fever, urticaria, joint pain, lymphadenopathy, SJS with sulphonamides", "Glucocorticoids"],
["IV – Delayed/Cell-mediated", "T lymphocytes (ONLY type NOT antibody-mediated)", "1–2 days", "Contact dermatitis (local anaesthetic creams, topical antibiotics)", "Glucocorticoids"],
],
col_w=[32*mm, 32*mm, 18*mm, 60*mm, 31*mm]
))
story.append(sp(4))
story.append(mnemonic_box("MNEMONIC: Hypersensitivity Types – 'ACID'",
["Type I → <b>A</b>naphylactic (IgE)",
"Type II → <b>C</b>ytotoxic (IgG, IgM)",
"Type III → <b>I</b>mmune complex (IgG complexes)",
"Type IV → <b>D</b>elayed (T cells – only non-antibody type)"]))
story.append(sp(4))
story.append(p("<b>Treatment of Anaphylactic Shock (MEDICAL EMERGENCY):</b>", H3))
story.append(highlight_box(
"1. <b>Adrenaline</b> (1:1000) – 0.3–0.5 mL IM (FIRST LINE)<br/>"
"2. <b>Hydrocortisone</b> – 100–200 mg IV<br/>"
"3. <b>Pheniramine</b> – 45 mg IM/IV (antihistamine)<br/>"
"4. Maintain patent airway + IV fluids"))
story.append(sp(4))
story.append(p("<b>Organ-Specific Toxicity:</b>", BODY_B))
story.append(mnemonic_box("MNEMONIC: Nephrotoxic Drugs – 'VACATION'",
["<b>V</b>ancomycin",
"<b>A</b>minoglycosides",
"<b>C</b>isplatin",
"<b>A</b>mphotericin B",
"<b>T</b>etracyclines (Fanconi syndrome)",
"<b>I</b>ndinavir",
"<b>O</b>ther: Gold salts",
"<b>N</b>ystatin, Cyclosporine"]))
story.append(sp(3))
story.append(two_col_table(
["Organ", "Toxic Drugs"],
[
["Hepatotoxic", "Isoniazid, Rifampicin, Pyrazinamide, Halothane, Paracetamol"],
["Nephrotoxic", "VACATION (see mnemonic above)"],
["Ototoxic", "Aminoglycosides, Loop diuretics, Cisplatin"],
["Ocular toxicity", "Ethambutol (optic neuritis), Chloroquine (retinopathy), Glucocorticoids (cataracts/glaucoma)"],
["Photosensitivity – Photoallergy", "Sulphonamides (cell-mediated immune response)"],
["Photosensitivity – Phototoxicity", "Doxycycline, Fluoroquinolones (local UV reaction – erythema, blisters)"],
],
col_w=[40*mm, W-40*mm]
))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════
# SECTION 14 – DRUG DEPENDENCE & TERATOGENICITY
# ══════════════════════════════════════════════════════════════
story.append(section_header("14. DRUG DEPENDENCE, IDIOSYNCRASY & TERATOGENICITY"))
story.append(sp(4))
story.append(p("<b>Idiosyncrasy</b> = Genetically determined abnormal reaction to drug", BODY_B))
story.append(two_col_table(
["Drug", "Idiosyncratic Reaction", "Cause"],
[
["Chloramphenicol", "Aplastic anaemia", "Genetic susceptibility"],
["Succinylcholine", "Prolonged apnoea", "Atypical pseudocholinesterase"],
["Primaquine/Sulphonamides/Dapsone", "Haemolytic anaemia", "G6PD deficiency"],
],
col_w=[50*mm, 65*mm, W-115*mm]
))
story.append(sp(4))
story.append(p("<b>Drug Dependence – Treatment Principles:</b>", BODY_B))
story.append(mnemonic_box("MNEMONIC: Treatment of Drug Dependence – 'HSAPG'",
["<b>H</b>ospitalization",
"<b>S</b>ubstitution therapy: Methadone for morphine addiction",
"<b>A</b>version therapy: Disulfiram for alcohol addiction",
"<b>P</b>sychotherapy",
"<b>G</b>eneral measures: Nutrition, family support, rehabilitation"]))
story.append(sp(4))
story.append(p("<b>Teratogenicity – Gestational Risk:</b>", BODY_B))
story.append(two_col_table(
["Gestational Age", "Teratogenic Effect"],
[
["Conception to 16 days", "Abortion (all or nothing)"],
["2–8 weeks (organogenesis)", "Structural abnormalities (MOST DANGEROUS PERIOD)"],
["2nd and 3rd trimester", "Growth retardation, functional defects"],
],
col_w=[55*mm, W-55*mm]
))
story.append(sp(4))
story.append(mnemonic_box("MNEMONIC: Teratogenic Drugs – 'The T's' (plus ACE + Warfarin)",
["<b>T</b>halidomide → Phocomelia (seal limbs)",
"<b>T</b>etracyclines → Yellowish discolouration of teeth; bone growth inhibition",
"<b>T</b>hyroid drugs (antithyroid) → Fetal goitre",
"<b>A</b>CE inhibitors → Fetal renal damage (2nd/3rd trimester)",
"<b>C</b>arbamazepine/Valproate → Neural tube defects",
"<b>E</b>thinylestradiol (high-dose) → Virilization of female fetus",
"<b>W</b>arfarin → Warfarin embryopathy (1st trimester); fetal haemorrhage (3rd trimester)",
"<b>M</b>ethotrexate → Spontaneous abortion, organogenesis defects"]))
story.append(sp(4))
story.append(p("<b>Pharmacogenetics – Key Examples:</b>", BODY_B))
story.append(two_col_table(
["Genetic Variation", "Drug Affected", "Clinical Consequence"],
[
["Slow acetylators", "Isoniazid (INH)", "↑ incidence of peripheral neuritis; need lower dose"],
["Fast acetylators", "Isoniazid (INH)", "Higher dose required for therapeutic effect"],
["Atypical pseudocholinesterase", "Succinylcholine", "Prolonged apnoea (dangerous)"],
["G6PD deficiency", "Primaquine, Sulphonamides, Dapsone, Salicylates", "Haemolytic anaemia"],
["Malignant hyperthermia susceptibility", "Halothane + Succinylcholine", "Dangerous rise in body temperature"],
["Acute porphyria susceptibility", "Barbiturates (induce ALA synthase)", "Precipitation of porphyria attacks"],
],
col_w=[45*mm, 50*mm, W-95*mm]
))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════
# SECTION 15 – TREATMENT OF POISONING
# ══════════════════════════════════════════════════════════════
story.append(section_header("15. TREATMENT OF POISONING"))
story.append(sp(4))
story.append(highlight_box("All poisoning cases = <b>MEDICO-LEGAL CASES</b> → Police must be informed"))
story.append(sp(4))
story.append(p("<b>General Management (Mnemonic: A to H):</b>", BODY_B))
story.append(mnemonic_box("MNEMONIC: General Management of Poisoning – 'A to H'",
["<b>H</b>ospitalization",
"<b>A</b>irway – clear; left lateral position; cuffed endotracheal tube if unconscious",
"<b>B</b>reathing – O₂ for hypoxaemia; mechanical ventilation if needed",
"<b>C</b>irculation – IV line; monitor pulse and BP",
"<b>D</b>econtaminate (prevent further absorption):",
" • Inhaled: fresh air | Contact: remove clothes, wash with soap/water",
" • Ingested: Gastric lavage within 2–3 hours; Activated charcoal",
"<b>E</b>liminate (promote excretion): Diuretics; Alkalinize/Acidify urine; Dialysis",
"<b>F</b>luids and electrolyte balance",
"<b>G</b>lucose/General symptomatic: IV diazepam 5–10 mg for convulsions; cooling for hyperpyrexia",
"<b>H</b>ealth: Specific antidotes (see table below)"]))
story.append(sp(4))
story.append(p("<b>Contraindications to Gastric Lavage:</b>", BODY_B))
story.append(bullet("Corrosives (carbolic acid, strong acids/alkalis)"))
story.append(bullet("Petroleum products (kerosene)"))
story.append(bullet("Convulsants (risk of aspiration)"))
story.append(sp(4))
story.append(p("<b>Urine Manipulation in Poisoning:</b>", BODY_B))
story.append(two_col_table(
["Poison", "Urine Modification", "Drug Used"],
[
["Salicylates / Barbiturates", "ALKALINIZE urine → ionizes acidic drug → cannot be reabsorbed → excreted", "Sodium bicarbonate (NaHCO₃)"],
["Amphetamine / Quinidine", "ACIDIFY urine → ionizes basic drug → cannot be reabsorbed → excreted", "Ascorbic acid (Vitamin C)"],
["Severe poisoning (lithium, aspirin, methanol)", "Dialysis", "Haemodialysis"],
],
col_w=[35*mm, 90*mm, 48*mm]
))
story.append(sp(5))
story.append(p("<b>ANTIDOTES TABLE (HIGH YIELD):</b>", H3))
story.append(two_col_table(
["POISON", "ANTIDOTE"],
[
["Organophosphorus compounds (OPC)", "Atropine (+ Pralidoxime/2-PAM for OPC)"],
["Morphine / Opioids", "Naloxone"],
["Atropine / Anticholinergics", "Physostigmine"],
["Benzodiazepines", "Flumazenil"],
["Carbamates", "Atropine"],
["Cyanide", "Sodium nitrite + Sodium thiosulphate"],
["Methanol / Ethylene glycol", "Fomepizole; Ethyl alcohol"],
["Paracetamol", "N-acetylcysteine (NAC)"],
["Heparin", "Protamine sulphate"],
["Warfarin", "Vitamin K1 (Phytonadione)"],
["Iron compounds", "Desferrioxamine"],
["Alkalies", "Dilute acetic acid (vinegar)"],
["Heavy metals (Arsenic, Gold)", "BAL (Dimercaprol)"],
["Copper/Lead poisoning", "D-Penicillamine"],
["Iron poisoning", "Desferrioxamine"],
["Digoxin toxicity", "Digoxin-specific antibody fragments (Digifab)"],
],
col_w=[W/2, W/2],
header_bg=RED
))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════
# PAGE – MASTER MNEMONIC SHEET
# ══════════════════════════════════════════════════════════════
story.append(banner("MASTER MNEMONIC SHEET", "General Pharmacology – All Key Mnemonics", bg=ORANGE))
story.append(sp(8))
mnemonics = [
("PAFFE – Membrane Transport", [
"P – Passive diffusion | A – Active transport | F – Facilitated diffusion | F – Filtration | E – Endocytosis"]),
("Acid in Acid, Base in Base – pH Absorption", [
"Weakly ACIDIC drugs absorbed from ACIDIC stomach (e.g., barbiturates, aspirin)",
"Weakly BASIC drugs absorbed from alkaline INTESTINE (e.g., morphine, amphetamine)"]),
("PRP-FAGE-HE – 10 Factors Affecting Bioavailability", [
"Physicochemical | Route | pH & ionization | Food | Area of surface | GI diseases | Enterohepatic cycling | Hepatic diseases | Enzyme (first-pass)"]),
("TeTCDiG – Drug Tissue Reservoirs", [
"Tetracyclines→Bones/Teeth | Thiopentone/DDT→Adipose | Chloroquine→Liver/Retina | Digoxin→Heart"]),
("WAVED – Highly Protein-Bound Drugs", [
"Warfarin | Amiodarone | Valproate | Erythromycin | Diazepam/Digoxin"]),
("BITS – Uses of Prodrugs", [
"Bioavailability↑ (levodopa) | Improve taste (clindamycin palmitate) | Time↑/prolong (fluphenazine) | Site-specific (methenamine)"]),
("RPBCG – Enzyme Inducers", [
"Rifampicin | Phenytoin | Barbiturates | Carbamazepine | Griseofulvin",
"Tip: 'Really Powerful But Confusing Guys'"]),
("CCEM – Enzyme Inhibitors", [
"Chloramphenicol | Ciprofloxacin | Erythromycin | Metronidazole (+ Ketoconazole)"]),
("KLFSBSM – Routes of Excretion", [
"Kidney | Lungs | Faeces | Skin | Bile | Saliva | Milk"]),
("NARROW – Indications for TDM", [
"Narrow TI drugs | Ascertain compliance | Renal failure | Random variation (TCA) | Off-response | Work up for poisoning"]),
("LPAD – Narrow Therapeutic Index Drugs", [
"Lithium | Phenytoin | Aminoglycosides | Digoxin (+Theophylline, Warfarin, Cyclosporine)"]),
("LGEN – Receptor Types (speed order)", [
"Ligand-gated (ms) | G-protein coupled (s) | Enzyme-linked (min–hrs) | Nuclear (hrs)"]),
("ACID – Hypersensitivity Types", [
"A–Anaphylactic (Type I, IgE) | C–Cytotoxic (Type II, IgG/IgM)",
"I–Immune complex (Type III, IgG) | D–Delayed (Type IV, T cells)"]),
("VACATION – Nephrotoxic Drugs", [
"Vancomycin | Aminoglycosides | Cisplatin | Amphotericin B | Tetracyclines (Fanconi) | Indinavir | Other (gold salts) | Nystatin/Cyclosporine"]),
("The T's – Teratogenic Drugs", [
"Thalidomide (phocomelia) | Tetracyclines (teeth discolouration) | Thyroid drugs (fetal goitre)",
"Also: ACE inhibitors (renal damage), Carbamazepine/Valproate (NTDs), Warfarin (embryopathy), Methotrexate"]),
("HSAPG – Drug Dependence Treatment", [
"Hospitalization | Substitution (methadone) | Aversion (disulfiram) | Psychotherapy | General measures"]),
("A to H – General Management of Poisoning", [
"Hospitalize | Airway | Breathing | Circulation | Decontaminate | Eliminate | Fluid balance | General/specific treatment"]),
]
for title, lines in mnemonics:
story.append(mnemonic_box(title, lines))
story.append(sp(5))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════
# PAGE – HIGH-YIELD EXAM TABLES
# ══════════════════════════════════════════════════════════════
story.append(banner("HIGH-YIELD EXAM TABLES", "Quick-Reference for Exam Day", bg=TEAL))
story.append(sp(8))
story.append(p("<b>PRODRUG EXAMPLES:</b>", H3))
story.append(two_col_table(
["Prodrug", "Active Drug"],
[
["Levodopa", "Dopamine"],
["Prednisone", "Prednisolone"],
["Codeine", "Morphine (active metabolite)"],
["Enalapril", "Enalaprilat"],
["Clopidogrel", "Active thienopyridine metabolite"],
["Methenamine", "Formaldehyde (in acidic urine)"],
],
col_w=[W/2, W/2]
))
story.append(sp(5))
story.append(p("<b>FIRST-PASS EFFECT EXAMPLES:</b>", H3))
story.append(two_col_table(
["Drug", "First-Pass Site", "Clinical Significance"],
[
["Lignocaine", "Liver", "Given IV for ventricular arrhythmias (oral not effective)"],
["Isoprenaline", "Liver", "Given IV (oral bioavailability very low)"],
["Nitroglycerin", "Liver + gut wall", "Given sublingually or transdermally (oral poor bioavailability)"],
["Propranolol", "Liver", "Oral dose >> IV dose; hepatic disease → ↑ bioavailability"],
["Morphine", "Liver", "Oral bioavailability ~30%; oral dose higher than parenteral"],
],
col_w=[30*mm, 25*mm, W-55*mm]
))
story.append(sp(5))
story.append(p("<b>ACTIVE METABOLITES:</b>", H3))
story.append(two_col_table(
["Parent Drug", "Active Metabolite", "Note"],
[
["Diazepam", "Oxazepam (also Desmethyldiazepam)", "Prolonged action due to active metabolites"],
["Codeine", "Morphine", "Analgesic effect is mainly from morphine"],
["Paracetamol (overdose)", "NAPQI (toxic)", "Depletes glutathione → hepatotoxicity"],
["Carbamazepine", "Carbamazepine-10,11-epoxide", "Active; contributes to toxicity"],
["Amitriptyline", "Nortriptyline", "Also active antidepressant"],
],
col_w=[40*mm, 55*mm, W-95*mm]
))
story.append(sp(5))
story.append(p("<b>DRUGS EXCRETED UNCHANGED (No Hepatic Metabolism):</b>", H3))
story.append(highlight_box(
"Penicillin G, Gentamicin, Streptomycin, Digoxin (partially), Lithium, Metformin<br/>"
"→ Dose adjustment needed in <b>RENAL FAILURE</b>"))
story.append(sp(5))
story.append(p("<b>ZERO-ORDER KINETICS DRUGS:</b>", H3))
story.append(two_col_table(
["Drug", "Note"],
[
["Ethanol", "Eliminated at constant rate of ~10 mL/hour regardless of dose"],
["Phenytoin (high dose)", "Switches from first-order to zero-order → saturation kinetics → toxicity"],
["Aspirin (high dose)", "Saturates metabolism → zero-order kinetics"],
],
col_w=[W/3, 2*W/3]
))
story.append(sp(5))
story.append(p("<b>DRUGS REQUIRING DOSE REDUCTION IN SPECIAL POPULATIONS:</b>", H3))
story.append(two_col_table(
["Condition", "Drugs Needing Dose Reduction", "Reason"],
[
["Renal failure", "Aminoglycosides, Penicillin, Digoxin, Lithium, Metformin", "Primarily renally excreted; accumulates"],
["Hepatic failure", "Propranolol, Lignocaine, Morphine, Diazepam, Metronidazole", "Primarily hepatically metabolized; accumulates"],
["Elderly", "Aminoglycosides, Digoxin, Benzodiazepines", "Reduced renal + hepatic function"],
["Neonates", "Chloramphenicol (grey baby), Sulphonamides (kernicterus)", "Immature enzymes"],
],
col_w=[30*mm, 75*mm, W-105*mm]
))
story.append(sp(5))
story.append(p("<b>TOLERANCE – KEY FACTS:</b>", H3))
story.append(two_col_table(
["Type", "Mechanism", "Example"],
[
["Pharmacokinetic tolerance", "↑ Metabolism (enzyme induction)", "Rifampicin enhances OCP metabolism → contraceptive failure"],
["Pharmacodynamic tolerance", "Receptor downregulation (↓ receptors)", "Opioids, Barbiturates, Salbutamol"],
["Cross-tolerance", "Tolerance to related drugs", "Nitroglycerin ↔ other nitrates; Ether ↔ Alcohol"],
["Tachyphylaxis (acute tolerance)", "Depletion of noradrenaline stores", "Ephedrine, Amphetamine, Tyramine (repeated doses → reduced BP effect)"],
],
col_w=[40*mm, 60*mm, W-100*mm]
))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════
# FINAL PAGE – ONE-PAGE RAPID REVISION CARD
# ══════════════════════════════════════════════════════════════
story.append(banner("ONE-PAGE RAPID REVISION CARD", "General Pharmacology – Last 30 Minutes Before Exam", bg=RED))
story.append(sp(6))
rapid_data = [
["Membrane transport – most common", "Passive diffusion"],
["Most common metabolic transformation", "Active → Inactive metabolite"],
["Main site of drug metabolism", "Liver (CYP3A4/5 is most important enzyme)"],
["Exception: Phase II before Phase I", "Isoniazid (INH) – acetylation before oxidation"],
["Hofmann elimination (no enzyme)", "Atracurium"],
["Narrowest TI drugs (need TDM)", "Lithium, Phenytoin, Aminoglycosides, Digoxin"],
["Drugs NOT stopped abruptly", "Propranolol (rebound MI), Corticosteroids, Clonidine"],
["Zero-order kinetics drugs", "Ethanol, Phenytoin (high dose), Aspirin (high dose)"],
["First-pass effect drugs", "Lignocaine, Isoprenaline, Nitroglycerin, Propranolol"],
["Enterohepatic cycling drugs", "Morphine, Doxycycline"],
["Redistribution drug", "Thiopentone (short action → used for GA induction)"],
["High Vd drugs (dialysis useless)", "Chloroquine (13,000 L), Digoxin (500 L)"],
["BBB – impermeable to", "Ionized, large molecules (dopamine, aminoglycosides)"],
["BBB – permeable in disease", "Penicillin G during meningitis/encephalitis"],
["Tachyphylaxis examples", "Ephedrine, Amphetamine, Tyramine"],
["Anaphylaxis – 1st line drug", "Adrenaline 1:1000, 0.3–0.5 mL IM"],
["Only non-antibody hypersensitivity", "Type IV (T-cell mediated, delayed)"],
["Stevens-Johnson syndrome", "Type III; caused by Sulphonamides, NSAIDs"],
["Thalidomide teratogenicity", "Phocomelia"],
["Most dangerous teratogenic period", "2–8 weeks (organogenesis)"],
["Opioid substitution therapy", "Methadone"],
["Alcohol aversion therapy", "Disulfiram"],
["Antidote: Paracetamol", "N-acetylcysteine (NAC)"],
["Antidote: Opioids", "Naloxone"],
["Antidote: Benzodiazepines", "Flumazenil"],
["Antidote: Heparin", "Protamine sulphate"],
["Antidote: Warfarin", "Vitamin K1 (Phytonadione)"],
["Antidote: Iron", "Desferrioxamine"],
["Antidote: Organophosphorus", "Atropine (+ Pralidoxime)"],
["Antidote: Cyanide", "Sodium nitrite + Sodium thiosulphate"],
["Gastric lavage contraindicated in", "Corrosives, Petroleum products, Convulsants"],
["Salicylate poisoning – urine", "ALKALINIZE (NaHCO₃)"],
["Amphetamine poisoning – urine", "ACIDIFY (Vitamin C)"],
["Nephrotoxic drugs", "VACATION (Vancomycin, Aminoglycosides, Cisplatin, Amphotericin B, Tetracyclines, Indinavir, Other, Nystatin)"],
["National Pharmacovigilance Centre", "Ghaziabad, India"],
["International PV Centre", "Uppsala Monitoring Centre, Sweden"],
["Probenecid + Penicillin", "Blocks tubular secretion → ↑ penicillin levels (beneficial)"],
["Rifampicin + OCP", "Enzyme induction → contraceptive failure"],
["Salicylates + Warfarin", "Protein displacement → ↑ bleeding risk"],
["Phenytoin + Dextrose IV", "Precipitates! Use normal saline"],
]
for item in rapid_data:
rd = Table([[p(f"<b>{item[0]}</b>", BODY_B), p(item[1], BODY)]], colWidths=[75*mm, W-75*mm])
rd.setStyle(TableStyle([
("ROWBACKGROUNDS", (0,0), (-1,-1), [LGREEN, WHITE]),
("GRID", (0,0), (-1,-1), 0.3, colors.lightgrey),
("TOPPADDING", (0,0), (-1,-1), 3),
("BOTTOMPADDING", (0,0), (-1,-1), 3),
("LEFTPADDING", (0,0), (-1,-1), 8),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(rd)
# ── Build ──────────────────────────────────────────────────────
doc.build(story)
print(f"PDF generated successfully: {OUTPUT}")