Drug dose adjustments in chronic hepatic disease for 10marks question
| Parameter | Change | Clinical Impact |
|---|---|---|
| Hepatic blood flow | Reduced (portosystemic shunting) | Reduced first-pass extraction |
| Hepatocellular mass | Reduced | Reduced intrinsic clearance |
| Plasma protein (albumin) | Reduced | Increased free drug fraction |
| Volume of distribution | Increased (ascites, edema) | Drug dilution; loading dose may need to increase |
| Biliary excretion | Impaired | Accumulation of some drugs |
| Gut wall absorption | Variable | Altered bioavailability |
| Parameter | 1 Point | 2 Points | 3 Points |
|---|---|---|---|
| Bilirubin (mg/dL) | < 2 | 2-3 | > 3 |
| Albumin (g/dL) | > 3.5 | 2.8-3.5 | < 2.8 |
| PT prolongation (sec) | < 4 | 4-6 | > 6 |
| Ascites | None | Mild | Severe |
| Encephalopathy | None | Grade I-II | Grade III-IV |
| Drug | Action Required |
|---|---|
| Morphine | Extend interval; avoid in encephalopathy |
| Meperidine | Avoid |
| Fentanyl, remifentanil | Safe - no dose change needed |
| Diazepam | Reduce dose; prefer oxazepam/lorazepam |
| Propranolol (oral) | Significant dose reduction |
| Warfarin | Extreme sensitivity - monitor INR closely |
| Phenytoin | Monitor free levels; reduce if needed |
| Vecuronium/rocuronium | Prolonged action - reduce and monitor |
| Atracurium/cisatracurium | Safe - no dose change |
| Metformin | Avoid in significant impairment |
| Paracetamol | Reduce to max 2 g/day |
| NSAIDs | Avoid in advanced cirrhosis |
| Valproate | Avoid |
Create a study guide PDF on hepatic dose adjustment for exams
mkdir -p /tmp/workspace/hepatic-dose-guide && ls /tmp/workspace/
~/hepatic-dose-guide/generate_pdf.py
from reportlab.platypus import (
SimpleDocTemplate, Table, TableStyle, Paragraph, Spacer,
HRFlowable, KeepTogether, PageBreak
)
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib import colors
from reportlab.lib.pagesizes import A4
from reportlab.lib.units import mm, cm
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import ListFlowable, ListItem
OUTPUT = "/tmp/workspace/hepatic-dose-guide/Hepatic_Dose_Adjustment_Study_Guide.pdf"
# ── Colour palette ──────────────────────────────────────────────────────────
DARK_BLUE = colors.HexColor("#1A3A5C")
MED_BLUE = colors.HexColor("#2E6DA4")
LIGHT_BLUE = colors.HexColor("#D6E8F7")
ACCENT_TEAL = colors.HexColor("#1B7A8A")
LIGHT_TEAL = colors.HexColor("#D4EEF1")
WARN_RED = colors.HexColor("#C0392B")
WARN_LIGHT = colors.HexColor("#FADBD8")
SAFE_GREEN = colors.HexColor("#1A7A4A")
SAFE_LIGHT = colors.HexColor("#D5F0E0")
ORANGE = colors.HexColor("#D35400")
ORANGE_LIGHT= colors.HexColor("#FDEBD0")
GREY_BG = colors.HexColor("#F4F6F9")
GREY_DARK = colors.HexColor("#4A4A4A")
WHITE = colors.white
# ── Document setup ───────────────────────────────────────────────────────────
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
leftMargin=18*mm, rightMargin=18*mm,
topMargin=18*mm, bottomMargin=18*mm,
title="Hepatic Dose Adjustment – Exam Study Guide",
author="Orris Medical AI",
)
# ── Styles ───────────────────────────────────────────────────────────────────
base = getSampleStyleSheet()
def S(name, **kw):
return ParagraphStyle(name, **kw)
sTitle = S("sTitle",
fontSize=26, leading=32, textColor=WHITE,
fontName="Helvetica-Bold", alignment=TA_CENTER, spaceAfter=4)
sSubtitle = S("sSubtitle",
fontSize=13, leading=18, textColor=colors.HexColor("#B8D4ED"),
fontName="Helvetica", alignment=TA_CENTER, spaceAfter=2)
sSection = S("sSection",
fontSize=14, leading=18, textColor=WHITE,
fontName="Helvetica-Bold", alignment=TA_LEFT,
spaceBefore=6, spaceAfter=4, leftIndent=0)
sSubsec = S("sSubsec",
fontSize=11, leading=15, textColor=DARK_BLUE,
fontName="Helvetica-Bold", spaceBefore=8, spaceAfter=3)
sBody = S("sBody",
fontSize=9.5, leading=14, textColor=GREY_DARK,
fontName="Helvetica", alignment=TA_JUSTIFY, spaceAfter=4)
sBullet = S("sBullet",
fontSize=9.5, leading=14, textColor=GREY_DARK,
fontName="Helvetica", leftIndent=12, spaceAfter=2)
sNote = S("sNote",
fontSize=8.5, leading=12, textColor=colors.HexColor("#5D4037"),
fontName="Helvetica-Oblique", leftIndent=8, spaceAfter=3)
sWarn = S("sWarn",
fontSize=9, leading=13, textColor=WARN_RED,
fontName="Helvetica-Bold", leftIndent=8, spaceAfter=2)
sSafe = S("sSafe",
fontSize=9, leading=13, textColor=SAFE_GREEN,
fontName="Helvetica-Bold", leftIndent=8, spaceAfter=2)
sTableHead = S("sTableHead",
fontSize=9, leading=12, textColor=WHITE,
fontName="Helvetica-Bold", alignment=TA_CENTER)
sTableCell = S("sTableCell",
fontSize=8.5, leading=12, textColor=GREY_DARK,
fontName="Helvetica", alignment=TA_LEFT)
sTableCellC = S("sTableCellC",
fontSize=8.5, leading=12, textColor=GREY_DARK,
fontName="Helvetica", alignment=TA_CENTER)
sPageNum = S("sPageNum",
fontSize=8, leading=10, textColor=colors.HexColor("#888888"),
fontName="Helvetica", alignment=TA_CENTER)
sMemBox = S("sMemBox",
fontSize=9, leading=13, textColor=colors.HexColor("#4A235A"),
fontName="Helvetica-Bold", leftIndent=6, spaceAfter=2)
# ── Helper: section banner ────────────────────────────────────────────────────
def section_banner(text, color=DARK_BLUE):
data = [[Paragraph(text, sSection)]]
t = Table(data, colWidths=[174*mm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), color),
("ROWPADDING", (0,0), (-1,-1), 7),
("LEFTPADDING", (0,0), (-1,-1), 10),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("TOPPADDING", (0,0), (-1,-1), 6),
]))
return t
def mini_banner(text, color=ACCENT_TEAL):
data = [[Paragraph(text, S("mb", fontSize=10, leading=13,
textColor=WHITE, fontName="Helvetica-Bold",
alignment=TA_LEFT))]]
t = Table(data, colWidths=[174*mm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), color),
("ROWPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 10),
]))
return t
def bullet(text, style=sBullet):
return Paragraph(f"• {text}", style)
def warn_box(text):
data = [[Paragraph(f"⚠ {text}", sWarn)]]
t = Table(data, colWidths=[174*mm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), WARN_LIGHT),
("LEFTPADDING", (0,0), (-1,-1), 8),
("ROWPADDING", (0,0), (-1,-1), 5),
("BOX", (0,0), (-1,-1), 0.5, WARN_RED),
]))
return t
def safe_box(text):
data = [[Paragraph(f"✓ {text}", sSafe)]]
t = Table(data, colWidths=[174*mm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), SAFE_LIGHT),
("LEFTPADDING", (0,0), (-1,-1), 8),
("ROWPADDING", (0,0), (-1,-1), 5),
("BOX", (0,0), (-1,-1), 0.5, SAFE_GREEN),
]))
return t
def info_box(text, bg=LIGHT_BLUE):
data = [[Paragraph(text, sNote)]]
t = Table(data, colWidths=[174*mm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("LEFTPADDING", (0,0), (-1,-1), 10),
("ROWPADDING", (0,0), (-1,-1), 5),
("BOX", (0,0), (-1,-1), 0.5, MED_BLUE),
]))
return t
def mem_box(title, text, bg=colors.HexColor("#EDE7F6")):
data = [[Paragraph(f"🧠 {title}: {text}", sMemBox)]]
t = Table(data, colWidths=[174*mm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("LEFTPADDING", (0,0), (-1,-1), 8),
("ROWPADDING", (0,0), (-1,-1), 5),
("BOX", (0,0), (-1,-1), 0.5, colors.HexColor("#7B1FA2")),
]))
return t
def two_col(left_items, right_items):
"""Two-column layout using a borderless table."""
def make_cell(items):
return [Paragraph(i, sBody) for i in items]
data = [[make_cell(left_items), make_cell(right_items)]]
t = Table(data, colWidths=[85*mm, 85*mm])
t.setStyle(TableStyle([
("VALIGN", (0,0), (-1,-1), "TOP"),
("LEFTPADDING", (0,0), (-1,-1), 4),
("RIGHTPADDING", (0,0), (-1,-1), 4),
]))
return t
# ── Cover page ───────────────────────────────────────────────────────────────
elems = []
# Full-width cover band
cover_data = [[Paragraph("DRUG DOSE ADJUSTMENTS", sTitle)],
[Paragraph("in Chronic Hepatic Disease", sSubtitle)],
[Paragraph("Comprehensive Exam Study Guide • Pharmacology", sSubtitle)]]
cover_table = Table(cover_data, colWidths=[174*mm])
cover_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), DARK_BLUE),
("TOPPADDING", (0,0), (-1,-1), 12),
("BOTTOMPADDING", (0,0), (-1,-1), 12),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 10),
]))
elems.append(cover_table)
elems.append(Spacer(1, 6*mm))
# Quick-reference badge row
badge_data = [
[Paragraph("📋 Child-Pugh\nClassification", sBody),
Paragraph("🔬 Pharmacokinetic\nMechanisms", sBody),
Paragraph("💊 Drug Class\nAdjustments", sBody),
Paragraph("⚠️ Avoid / Safe\nDrug Lists", sBody),
Paragraph("🧠 Memory\nAids", sBody)],
]
bt = Table(badge_data, colWidths=[34*mm]*5)
bt.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), LIGHT_BLUE),
("ALIGN", (0,0), (-1,-1), "CENTER"),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("ROWPADDING", (0,0), (-1,-1), 7),
("BOX", (0,0), (-1,-1), 1, MED_BLUE),
("INNERGRID", (0,0), (-1,-1), 0.5, MED_BLUE),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("FONTNAME", (0,0), (-1,-1), "Helvetica-Bold"),
("TEXTCOLOR", (0,0), (-1,-1), DARK_BLUE),
]))
elems.append(bt)
elems.append(Spacer(1, 5*mm))
elems.append(HRFlowable(width="100%", thickness=1.5, color=MED_BLUE))
elems.append(Spacer(1, 3*mm))
# ── SECTION 1: INTRODUCTION ───────────────────────────────────────────────────
elems.append(section_banner("1. WHY HEPATIC DOSE ADJUSTMENT MATTERS"))
elems.append(Spacer(1, 3*mm))
elems.append(Paragraph(
"The liver is the primary site of drug metabolism. Chronic hepatic disease — cirrhosis, chronic hepatitis, "
"hepatic fibrosis — disrupts absorption, distribution, metabolism and excretion of drugs. Failure to adjust "
"doses risks drug toxicity (e.g., hepatic encephalopathy from opioids, haemorrhage from warfarin) or "
"therapeutic failure. Unlike renal impairment where GFR guides dosing, <b>no single test reliably "
"predicts hepatic drug metabolism</b>. The Child-Pugh score is the standard clinical surrogate.", sBody))
elems.append(Spacer(1, 3*mm))
# ── SECTION 2: PK CHANGES ─────────────────────────────────────────────────────
elems.append(section_banner("2. PHARMACOKINETIC CHANGES IN CHRONIC LIVER DISEASE"))
elems.append(Spacer(1, 3*mm))
pk_data = [
[Paragraph("PK Parameter", sTableHead),
Paragraph("Change in Liver Disease", sTableHead),
Paragraph("Clinical Consequence", sTableHead)],
["Hepatic blood flow", "↓ (portosystemic shunting)", "High-extraction drugs: ↑ oral bioavailability"],
["Hepatocellular mass", "↓ (fibrosis, necrosis)", "Reduced intrinsic clearance of all hepatic drugs"],
["Plasma albumin", "↓ (hypoalbuminaemia)", "↑ free (active) drug fraction — enhanced effect/toxicity"],
["Volume of distribution", "↑ (ascites, oedema)", "Drug dilution; loading dose may need to ↑"],
["CYP450 enzyme activity", "↓ (varies by isoform)", "Prolonged half-life of CYP-metabolised drugs"],
["Biliary excretion", "Impaired (cholestasis)", "Accumulation of drugs excreted in bile"],
["Gut wall metabolism", "Reduced", "Further ↑ oral bioavailability"],
["Plasma cholinesterase", "↓ (reduced synthesis)", "Prolonged action of succinylcholine"],
]
pk_table = Table(pk_data, colWidths=[48*mm, 62*mm, 62*mm])
pk_ts = TableStyle([
("BACKGROUND", (0,0), (-1,0), MED_BLUE),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("ALIGN", (0,0), (-1,-1), "LEFT"),
("VALIGN", (0,0), (-1,-1), "TOP"),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, GREY_BG]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#BBBBBB")),
("LEFTPADDING", (0,0), (-1,-1), 6),
("ROWPADDING", (0,0), (-1,-1), 5),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
])
pk_table.setStyle(pk_ts)
elems.append(pk_table)
elems.append(Spacer(1, 3*mm))
elems.append(info_box(
"Key Point: Liver disease causes unpredictable changes — always start at the lowest effective dose "
"and titrate slowly. Monitor clinical response and drug levels where available."
))
elems.append(Spacer(1, 4*mm))
# ── SECTION 3: HEPATIC EXTRACTION RATIO ───────────────────────────────────────
elems.append(section_banner("3. HEPATIC EXTRACTION RATIO — THE CORE CONCEPT"))
elems.append(Spacer(1, 3*mm))
elems.append(Paragraph(
"Hepatic clearance = Hepatic blood flow (Q) × Extraction fraction (E). "
"The extraction ratio classifies drugs into two groups with fundamentally different behaviour in liver disease:", sBody))
elems.append(Spacer(1, 2*mm))
ext_data = [
[Paragraph("Feature", sTableHead),
Paragraph("HIGH Extraction\n(E > 0.7)\n'Flow-Limited'", sTableHead),
Paragraph("LOW Extraction\n(E < 0.3)\n'Capacity-Limited'", sTableHead)],
["Clearance depends on", "Hepatic blood flow", "Enzyme activity + protein binding"],
["Oral bioavailability normally", "LOW (extensive first-pass)", "HIGH (minimal first-pass)"],
["Effect of portal shunting", "↑↑ oral bioavailability", "Moderate effect"],
["Effect of enzyme loss", "Less affected", "More affected"],
["Half-life", "Short (e.g., propranolol t½ = 3.9 h)", "Long (e.g., diazepam t½ = 43 h)"],
["Examples", "Propranolol, labetalol, morphine,\nlidocaine, verapamil, nitrates,\nmetoprolol, pethidine",
"Warfarin, diazepam, phenytoin,\ntheophylline, tolbutamide,\nchlорpromazine"],
["Dose adjustment required", "Reduce oral dose significantly", "Reduce dose; monitor free levels"],
]
ext_table = Table(ext_data, colWidths=[45*mm, 64*mm, 63*mm])
ext_ts = TableStyle([
("BACKGROUND", (0,0), (0,0), MED_BLUE),
("BACKGROUND", (1,0), (1,0), colors.HexColor("#8E44AD")),
("BACKGROUND", (2,0), (2,0), ACCENT_TEAL),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("ALIGN", (0,0), (-1,-1), "LEFT"),
("VALIGN", (0,0), (-1,-1), "TOP"),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, GREY_BG]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#BBBBBB")),
("LEFTPADDING", (0,0), (-1,-1), 6),
("ROWPADDING", (0,0), (-1,-1), 5),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
])
ext_table.setStyle(ext_ts)
elems.append(ext_table)
elems.append(Spacer(1, 3*mm))
elems.append(mem_box("Mnemonic",
"HIGH extraction = HIGH first-pass, HIGHLY affected by blood flow. "
"LOW extraction = LOW first-pass, affected by Liver enzymes and protein binding."))
elems.append(Spacer(1, 4*mm))
# ── SECTION 4: CHILD-PUGH ─────────────────────────────────────────────────────
elems.append(section_banner("4. CHILD-PUGH SCORE — CLINICAL STAGING TOOL"))
elems.append(Spacer(1, 3*mm))
elems.append(Paragraph(
"Since no single blood test quantifies hepatic drug metabolism, the Child-Pugh (CTP) score is the "
"standard clinical tool for guiding dose adjustments:", sBody))
elems.append(Spacer(1, 2*mm))
cp_data = [
[Paragraph("Parameter", sTableHead),
Paragraph("1 Point", sTableHead),
Paragraph("2 Points", sTableHead),
Paragraph("3 Points", sTableHead)],
["Serum Bilirubin (mg/dL)", "< 2", "2 – 3", "> 3"],
["Serum Albumin (g/dL)", "> 3.5", "2.8 – 3.5", "< 2.8"],
["PT prolongation (seconds)", "< 4", "4 – 6", "> 6"],
["Ascites", "None", "Mild (controlled)", "Severe (refractory)"],
["Hepatic Encephalopathy", "None", "Grade I – II", "Grade III – IV"],
]
cp_table = Table(cp_data, colWidths=[52*mm, 40*mm, 40*mm, 40*mm])
cp_ts = TableStyle([
("BACKGROUND", (0,0), (-1,0), DARK_BLUE),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 9),
("ALIGN", (0,0), (-1,-1), "CENTER"),
("ALIGN", (0,0), (0,-1), "LEFT"),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, GREY_BG]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#BBBBBB")),
("LEFTPADDING", (0,0), (0,-1), 6),
("ROWPADDING", (0,0), (-1,-1), 5),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
])
cp_table.setStyle(cp_ts)
elems.append(cp_table)
elems.append(Spacer(1, 3*mm))
class_data = [
[Paragraph("Child-Pugh Class", sTableHead),
Paragraph("Score", sTableHead),
Paragraph("Severity", sTableHead),
Paragraph("Dosing Implication", sTableHead),
Paragraph("1-Year Survival", sTableHead)],
["A", "5 – 6", "Mild", "Minimal adjustment; monitor", "≥ 85%"],
["B", "7 – 9", "Moderate", "Significant dose reduction required", "~60%"],
["C", "10 – 15", "Severe", "Many drugs contraindicated; extreme caution", "~35%"],
]
class_table = Table(class_data, colWidths=[40*mm, 26*mm, 30*mm, 60*mm, 32*mm])
class_ts = TableStyle([
("BACKGROUND", (0,0), (-1,0), ACCENT_TEAL),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 9),
("ALIGN", (0,0), (-1,-1), "CENTER"),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("BACKGROUND", (0,1), (-1,1), colors.HexColor("#E8F8F0")),
("BACKGROUND", (0,2), (-1,2), ORANGE_LIGHT),
("BACKGROUND", (0,3), (-1,3), WARN_LIGHT),
("TEXTCOLOR", (0,1), (0,1), SAFE_GREEN),
("TEXTCOLOR", (0,2), (0,2), ORANGE),
("TEXTCOLOR", (0,3), (0,3), WARN_RED),
("FONTNAME", (0,1), (0,3), "Helvetica-Bold"),
("FONTSIZE", (0,1), (0,3), 13),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#BBBBBB")),
("ROWPADDING", (0,0), (-1,-1), 6),
])
class_table.setStyle(class_ts)
elems.append(class_table)
elems.append(Spacer(1, 3*mm))
elems.append(info_box(
"Note: The MELD score is increasingly used for end-stage liver disease prognosis, but Child-Pugh "
"remains the standard pharmacokinetic tool for dose adjustment guidance."
))
elems.append(PageBreak())
# ── SECTION 5: DRUG-SPECIFIC ADJUSTMENTS ──────────────────────────────────────
elems.append(section_banner("5. DRUG-SPECIFIC DOSE ADJUSTMENTS"))
elems.append(Spacer(1, 3*mm))
# 5A: Analgesics
elems.append(mini_banner("5A. Analgesics & Opioids"))
elems.append(Spacer(1, 2*mm))
opioid_data = [
[Paragraph("Drug", sTableHead),
Paragraph("Extraction\nRatio", sTableHead),
Paragraph("Behaviour in Liver Disease", sTableHead),
Paragraph("Action Required", sTableHead)],
["Morphine", "High",
"PK relatively preserved in mild cirrhosis (extrahepatic metabolism compensates). Reduced clearance after liver resection. Can precipitate/worsen encephalopathy.",
"Extend dosing interval. Avoid in encephalopathy. Use lower doses."],
["Pethidine\n(Meperidine)", "High",
"Metabolism markedly reduced. Toxic metabolite NORPETHIDINE accumulates → seizures, CNS depression mimicking encephalopathy.",
"⚠ AVOID in liver disease."],
["Fentanyl", "High",
"Disposition largely unaffected by liver disease. Clearance affected by hepatic blood flow changes.",
"Preferred opioid. Use normal doses initially; titrate."],
["Sufentanil", "High",
"Disposition largely unaffected by liver disease.",
"Generally safe; preferred over morphine/pethidine."],
["Remifentanil", "N/A",
"Hydrolysed by blood and tissue esterases — NOT hepatically metabolised. PK unchanged even in anhepatic phase of liver transplant.",
"✓ SAFE — no dose adjustment needed."],
["Alfentanil", "High",
"Clearance significantly decreased in mild-moderate cirrhosis.",
"Reduce infusion rate; monitor."],
["Paracetamol\n(Acetaminophen)", "Low",
"Generally safe in stable chronic liver disease. Risk increases with active hepatitis or alcoholic hepatitis.",
"Max 2 g/day in chronic liver disease. Avoid in acute alcoholic hepatitis."],
["NSAIDs", "Variable",
"Risk of renal impairment, GI bleeding, platelet inhibition, and precipitation of hepatorenal syndrome.",
"⚠ AVOID in cirrhosis (especially advanced)."],
["Codeine", "Intermediate",
"Prodrug requiring CYP2D6 conversion to morphine. Reduced conversion in liver disease.",
"Avoid or use cautiously; unpredictable effect."],
]
opioid_table = Table(opioid_data, colWidths=[30*mm, 20*mm, 72*mm, 50*mm])
opioid_ts = TableStyle([
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#6D4C41")),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8),
("ALIGN", (0,0), (-1,-1), "LEFT"),
("VALIGN", (0,0), (-1,-1), "TOP"),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, GREY_BG]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#BBBBBB")),
("LEFTPADDING", (0,0), (-1,-1), 5),
("ROWPADDING", (0,0), (-1,-1), 4),
("TOPPADDING", (0,0), (-1,-1), 3),
("BOTTOMPADDING", (0,0), (-1,-1), 3),
])
opioid_table.setStyle(opioid_ts)
elems.append(opioid_table)
elems.append(Spacer(1, 3*mm))
elems.append(warn_box("Pethidine (meperidine): ABSOLUTELY AVOID — norpethidine accumulation causes seizures."))
elems.append(safe_box("Remifentanil, fentanyl, sufentanil: Relatively safe choices in hepatic impairment."))
elems.append(Spacer(1, 4*mm))
# 5B: Sedatives/BZDs
elems.append(mini_banner("5B. Sedatives, Anxiolytics & Benzodiazepines"))
elems.append(Spacer(1, 2*mm))
benzo_data = [
[Paragraph("Drug", sTableHead),
Paragraph("Extraction", sTableHead),
Paragraph("Key Issue in Liver Disease", sTableHead),
Paragraph("Recommendation", sTableHead)],
["Diazepam", "Low",
"t½ = 43 h normally — greatly extended in cirrhosis. Complex changes in free fraction due to ↓albumin.",
"Avoid if possible. If needed, very low dose, extended interval."],
["Midazolam", "Low\n(E=0.30–0.44)",
"Prolonged action in liver disease due to reduced CYP3A4 activity. Protein binding changes complicate kinetics.",
"Reduce dose. Monitor for prolonged sedation."],
["Lorazepam", "Low",
"Undergoes glucuronidation ONLY (not CYP-dependent). Safer profile.",
"✓ Preferred BZD in liver disease. Reduce dose in severe disease."],
["Oxazepam", "Low",
"Also glucuronidation only. Short–intermediate t½.",
"✓ Preferred BZD in liver disease."],
["Temazepam", "Low",
"Glucuronidation only, similar to lorazepam/oxazepam.",
"✓ Relatively safe. Preferred over diazepam."],
["Chlordiazepoxide", "Low",
"Long-acting active metabolites; severely prolonged in cirrhosis.",
"Avoid in significant hepatic impairment."],
["Propofol", "High",
"Despite high extraction, clearance in cirrhotics similar to normal. However, pharmacodynamic effects more pronounced.",
"Reduce induction dose; titrate to effect."],
["Dexmedetomidine", "High",
"Duration of action prolonged in liver disease.",
"Reduce maintenance infusion rate."],
]
benzo_table = Table(benzo_data, colWidths=[32*mm, 24*mm, 70*mm, 46*mm])
benzo_ts = TableStyle([
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#1A5276")),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8),
("ALIGN", (0,0), (-1,-1), "LEFT"),
("VALIGN", (0,0), (-1,-1), "TOP"),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, GREY_BG]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#BBBBBB")),
("LEFTPADDING", (0,0), (-1,-1), 5),
("ROWPADDING", (0,0), (-1,-1), 4),
("TOPPADDING", (0,0), (-1,-1), 3),
("BOTTOMPADDING", (0,0), (-1,-1), 3),
])
benzo_table.setStyle(benzo_ts)
elems.append(benzo_table)
elems.append(Spacer(1, 3*mm))
elems.append(mem_box("Mnemonic for safe BZDs",
"'LOT' — Lorazepam, Oxazepam, Temazepam are safe (glucuronidation only, no active metabolites)."))
elems.append(Spacer(1, 4*mm))
# 5C: NMBAs
elems.append(mini_banner("5C. Neuromuscular Blocking Agents (NMBAs)"))
elems.append(Spacer(1, 2*mm))
nmba_data = [
[Paragraph("Drug", sTableHead),
Paragraph("Elimination", sTableHead),
Paragraph("Effect in Liver Disease", sTableHead),
Paragraph("Recommendation", sTableHead)],
["Vecuronium", "Hepatic (biliary)", "Prolonged duration. Initial resistance due to ↑ Vd (ascites, ↑globulins).", "Reduce dose; use peripheral nerve monitor."],
["Rocuronium", "Hepatic (biliary)", "Prolonged duration. Same resistance effect as vecuronium.", "Reduce dose; monitor."],
["Pancuronium", "Hepatic + Renal", "Prolonged action.", "Reduce dose; avoid in severe disease."],
["Atracurium", "Hofmann elimination\n(organ-independent)", "Duration UNAFFECTED by liver disease.", "✓ SAFE — preferred NMBA in liver failure."],
["Cisatracurium", "Hofmann elimination\n(organ-independent)", "Duration UNAFFECTED. Metabolite laudanosine excreted by liver but neurotoxicity not reported.", "✓ SAFE — preferred NMBA in liver failure."],
["Succinylcholine", "Plasma cholinesterase\n(↓ in cirrhosis)", "Mildly prolonged action. Plasma cholinesterase synthesis reduced.", "Generally clinically insignificant; use cautiously."],
["Mivacurium", "Plasma cholinesterase", "Prolonged action — avoid.", "⚠ Avoid in significant liver disease."],
]
nmba_table = Table(nmba_data, colWidths=[34*mm, 40*mm, 56*mm, 42*mm])
nmba_ts = TableStyle([
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#145A32")),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8),
("ALIGN", (0,0), (-1,-1), "LEFT"),
("VALIGN", (0,0), (-1,-1), "TOP"),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, GREY_BG]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#BBBBBB")),
("LEFTPADDING", (0,0), (-1,-1), 5),
("ROWPADDING", (0,0), (-1,-1), 4),
("TOPPADDING", (0,0), (-1,-1), 3),
("BOTTOMPADDING", (0,0), (-1,-1), 3),
])
nmba_table.setStyle(nmba_ts)
elems.append(nmba_table)
elems.append(Spacer(1, 3*mm))
elems.append(safe_box("Atracurium and Cisatracurium: Hofmann elimination — independent of liver AND kidney function. Always safe."))
elems.append(warn_box("Vecuronium/Rocuronium: Expect prolonged block + possible initial resistance — always use nerve stimulator."))
elems.append(PageBreak())
# 5D: Cardiovascular
elems.append(section_banner("5. DRUG-SPECIFIC ADJUSTMENTS (continued)"))
elems.append(Spacer(1, 3*mm))
elems.append(mini_banner("5D. Cardiovascular Drugs"))
elems.append(Spacer(1, 2*mm))
cvs_data = [
[Paragraph("Drug", sTableHead),
Paragraph("Key Issue", sTableHead),
Paragraph("Action", sTableHead)],
["Propranolol", "High extraction ratio. Oral bioavailability 2–3× higher in cirrhosis (portal bypass).",
"Significantly reduce oral dose. IV dose less affected."],
["Labetalol", "High extraction. Same mechanism as propranolol.",
"Reduce oral dose significantly."],
["Metoprolol", "High extraction.",
"Reduce dose; monitor HR/BP carefully."],
["Verapamil", "High extraction. Extensive first-pass bypassed in cirrhosis.",
"Reduce oral dose substantially."],
["Lidocaine", "High extraction (flow-limited). Clearance falls with ↓ hepatic blood flow.",
"Reduce infusion rate significantly. Risk of CNS toxicity."],
["Warfarin", "Low extraction. Already elevated INR due to impaired clotting factor synthesis.",
"Extreme sensitivity. Titrate with frequent INR monitoring. Usually no additional anticoagulation needed."],
["Digoxin", "Primarily renal excretion. Less affected by liver disease.",
"Caution in concurrent renal impairment (hepatorenal syndrome)."],
["Nitrates", "High extraction. Bioavailability markedly increased.",
"Reduce dose; monitor for hypotension."],
["Statins", "Hepatically metabolised; hepatotoxic potential.",
"Avoid in active liver disease. Contraindicated in Child-Pugh C."],
["ACE Inhibitors", "Primarily renal clearance.",
"Generally safe. Caution if hepatorenal syndrome develops."],
["Spironolactone", "Hepatically metabolised — used in ascites.",
"Generally safe; first-line for hepatic ascites. Monitor K⁺."],
["Furosemide", "Renal excretion; used for oedema/ascites.",
"Generally safe. Used alongside spironolactone."],
]
cvs_table = Table(cvs_data, colWidths=[35*mm, 85*mm, 52*mm])
cvs_ts = TableStyle([
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#7D3C98")),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8),
("ALIGN", (0,0), (-1,-1), "LEFT"),
("VALIGN", (0,0), (-1,-1), "TOP"),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, GREY_BG]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#BBBBBB")),
("LEFTPADDING", (0,0), (-1,-1), 5),
("ROWPADDING", (0,0), (-1,-1), 4),
("TOPPADDING", (0,0), (-1,-1), 3),
("BOTTOMPADDING", (0,0), (-1,-1), 3),
])
cvs_table.setStyle(cvs_ts)
elems.append(cvs_table)
elems.append(Spacer(1, 4*mm))
# 5E: Antimicrobials
elems.append(mini_banner("5E. Antimicrobials"))
elems.append(Spacer(1, 2*mm))
abx_data = [
[Paragraph("Drug/Class", sTableHead),
Paragraph("Hepatic Role", sTableHead),
Paragraph("Action in Liver Disease", sTableHead)],
["Penicillins, Cephalosporins,\nCarbapenems", "Primarily renally excreted", "Minimal hepatic dose adjustment; safe"],
["Aminoglycosides", "Renally excreted", "Safe from hepatic standpoint; risk of nephrotoxicity (→ hepatorenal syndrome)"],
["Metronidazole", "Hepatic metabolism", "Reduce dose in severe hepatic disease; accumulation"],
["Rifampicin", "Hepatic (potent CYP inducer)", "Hepatotoxic. Avoid in significant liver disease"],
["Clarithromycin", "Hepatic metabolism", "Dose adjustment needed; elevated LFTs, altered clearance"],
["Quinupristin/Dalfopristin", "Hepatic metabolism", "Dose adjustment required in hepatic impairment"],
["Chloramphenicol", "Hepatic conjugation", "Reduce dose in liver disease"],
["Erythromycin", "Hepatic metabolism", "Reduce dose; also hepatotoxic potential"],
["Tetracyclines", "Hepatic + renal", "Avoid in significant liver disease — hepatotoxic"],
["Fluconazole", "Partially hepatic", "Use with caution; hepatotoxic potential with azoles"],
["Isoniazid (INH)", "Hepatic (acetylation)", "Hepatotoxic — closely monitor LFTs; avoid if active liver disease"],
]
abx_table = Table(abx_data, colWidths=[52*mm, 44*mm, 76*mm])
abx_ts = TableStyle([
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#117A65")),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8),
("ALIGN", (0,0), (-1,-1), "LEFT"),
("VALIGN", (0,0), (-1,-1), "TOP"),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, GREY_BG]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#BBBBBB")),
("LEFTPADDING", (0,0), (-1,-1), 5),
("ROWPADDING", (0,0), (-1,-1), 4),
("TOPPADDING", (0,0), (-1,-1), 3),
("BOTTOMPADDING", (0,0), (-1,-1), 3),
])
abx_table.setStyle(abx_ts)
elems.append(abx_table)
elems.append(Spacer(1, 4*mm))
# 5F: Antiepileptics & Psych
elems.append(mini_banner("5F. Antiepileptics & Psychotropics"))
elems.append(Spacer(1, 2*mm))
aed_data = [
[Paragraph("Drug", sTableHead),
Paragraph("Key Issue", sTableHead),
Paragraph("Action", sTableHead)],
["Phenytoin",
"Low extraction, highly albumin-bound (90%). ↓Albumin in liver disease → ↑free phenytoin. Total levels appear falsely normal or low while free (ACTIVE) fraction is toxic.",
"Measure FREE phenytoin levels (not total). Dose may need reduction despite 'normal' total level."],
["Valproate", "Hepatotoxic — idiosyncratic and dose-related.", "⚠ AVOID in liver disease."],
["Carbamazepine", "CYP-metabolised; also enzyme-inducing.", "Reduce dose; monitor levels and LFTs."],
["Levetiracetam", "Primarily renal excretion.", "✓ Relatively safe in liver disease. Preferred agent."],
["Lamotrigine", "Hepatic glucuronidation.", "Reduce dose in severe hepatic impairment."],
["Sertraline (SSRI)", "Hepatically metabolised. t½ increases from 22h → 52h in mild cirrhosis.",
"Use lowest effective dose; extended interval."],
["Paroxetine, Fluvoxamine", "Hepatic metabolism.", "Use lowest dose. Monitor LFTs."],
["Tricyclics (TCAs)", "Extensive hepatic first-pass.", "Reduce dose. Risk of acute liver injury (rare). Sedation enhanced in encephalopathy."],
["Antipsychotics (typical/atypical)",
"Most extensively hepatically metabolised.", "Reduce dose in moderate-severe disease. Many contraindicated in Child-Pugh C."],
["Lithium", "Renally excreted.", "✓ Not hepatically metabolised. Dose based on renal function/levels."],
]
aed_table = Table(aed_data, colWidths=[38*mm, 80*mm, 54*mm])
aed_ts = TableStyle([
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#1B4F72")),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8),
("ALIGN", (0,0), (-1,-1), "LEFT"),
("VALIGN", (0,0), (-1,-1), "TOP"),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, GREY_BG]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#BBBBBB")),
("LEFTPADDING", (0,0), (-1,-1), 5),
("ROWPADDING", (0,0), (-1,-1), 4),
("TOPPADDING", (0,0), (-1,-1), 3),
("BOTTOMPADDING", (0,0), (-1,-1), 3),
])
aed_table.setStyle(aed_ts)
elems.append(aed_table)
elems.append(Spacer(1, 3*mm))
elems.append(warn_box("Phenytoin pitfall: Total level may be NORMAL but FREE (active) level can be TOXIC due to low albumin. Always check free phenytoin in hypoalbuminaemia."))
elems.append(PageBreak())
# 5G: Antidiabetics & Other
elems.append(section_banner("5. DRUG-SPECIFIC ADJUSTMENTS (continued)"))
elems.append(Spacer(1, 3*mm))
elems.append(mini_banner("5G. Antidiabetics, Anticoagulants & Miscellaneous"))
elems.append(Spacer(1, 2*mm))
misc_data = [
[Paragraph("Drug/Class", sTableHead),
Paragraph("Key Issue", sTableHead),
Paragraph("Action", sTableHead)],
["Metformin", "Hepatic disease → lactic acidosis risk (reduced hepatic lactate clearance).",
"⚠ AVOID in significant hepatic impairment."],
["Sulfonylureas (e.g., glibenclamide)", "Hepatically metabolised; hypoglycaemia risk prolonged.",
"⚠ AVOID — prolonged and unpredictable hypoglycaemia."],
["Insulin", "Not hepatically metabolised.", "✓ Preferred antidiabetic. May need dose ↓ as hepatic glucose metabolism impaired."],
["GLP-1 agonists, DPP-4 inhibitors", "Variable hepatic metabolism.", "Generally safe; use with caution in severe disease."],
["Warfarin", "Low extraction; PT/INR already elevated in cirrhosis due to factor deficiency.",
"Extreme sensitivity. Titrate with frequent INR monitoring."],
["Heparin (unfractionated)", "Reduced antithrombin III in cirrhosis may affect efficacy.",
"Use with caution; monitor aPTT."],
["LMWH (e.g., enoxaparin)", "Partially hepatic. Anti-Xa levels may be unreliable.",
"Use anti-Xa monitoring. Cautious use in severe disease."],
["DOACs (e.g., rivaroxaban, apixaban)", "Hepatic metabolism (CYP3A4).",
"Avoid in Child-Pugh B or C. Risk of bleeding from underlying coagulopathy."],
["Morphine-based cough suppressants", "Same issues as morphine.", "Avoid in hepatic encephalopathy risk patients."],
["Theophylline", "Low extraction; CYP1A2-metabolised.", "Reduce dose; monitor levels. Narrow therapeutic index."],
["Paracetamol (analgesic recap)", "Safe in stable cirrhosis at reduced doses.", "Max 2 g/day. Avoid in alcoholic hepatitis or acute liver failure."],
]
misc_table = Table(misc_data, colWidths=[48*mm, 72*mm, 52*mm])
misc_ts = TableStyle([
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#784212")),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8),
("ALIGN", (0,0), (-1,-1), "LEFT"),
("VALIGN", (0,0), (-1,-1), "TOP"),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, GREY_BG]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#BBBBBB")),
("LEFTPADDING", (0,0), (-1,-1), 5),
("ROWPADDING", (0,0), (-1,-1), 4),
("TOPPADDING", (0,0), (-1,-1), 3),
("BOTTOMPADDING", (0,0), (-1,-1), 3),
])
misc_table.setStyle(misc_ts)
elems.append(misc_table)
elems.append(Spacer(1, 4*mm))
# ── SECTION 6: QUICK REFERENCE – AVOID vs SAFE ────────────────────────────────
elems.append(section_banner("6. QUICK-REFERENCE: AVOID vs. SAFE IN HEPATIC DISEASE"))
elems.append(Spacer(1, 3*mm))
avoid_safe_data = [
[Paragraph("⚠ DRUGS TO AVOID / USE WITH EXTREME CAUTION",
S("avoidH", fontSize=10, leading=12, textColor=WHITE, fontName="Helvetica-Bold")),
Paragraph("✓ RELATIVELY SAFE DRUGS (no/minimal adjustment)",
S("safeH", fontSize=10, leading=12, textColor=WHITE, fontName="Helvetica-Bold"))],
[
Paragraph(
"• <b>Pethidine (meperidine)</b> — norpethidine toxicity<br/>"
"• <b>NSAIDs</b> — HRS, GI bleed, renal failure<br/>"
"• <b>Valproate</b> — hepatotoxic<br/>"
"• <b>Metformin</b> — lactic acidosis<br/>"
"• <b>Sulfonylureas</b> — prolonged hypoglycaemia<br/>"
"• <b>Tetracyclines</b> — hepatotoxic<br/>"
"• <b>Isoniazid (INH)</b> — hepatotoxic<br/>"
"• <b>Rifampicin</b> — hepatotoxic<br/>"
"• <b>DOACs</b> — Child-Pugh B/C: avoid<br/>"
"• <b>Statins</b> — Child-Pugh C: avoid<br/>"
"• <b>Diazepam</b> — prolonged sedation, encephalopathy<br/>"
"• <b>Mivacurium</b> — prolonged block<br/>"
"• <b>Sedatives generally</b> — precipitate encephalopathy", sBody),
Paragraph(
"• <b>Remifentanil</b> — esterase-metabolised<br/>"
"• <b>Fentanyl, sufentanil</b> — minimal hepatic change<br/>"
"• <b>Atracurium, cisatracurium</b> — Hofmann elimination<br/>"
"• <b>Lorazepam, oxazepam, temazepam</b> — glucuronidation only<br/>"
"• <b>Insulin</b> — not hepatically metabolised<br/>"
"• <b>Lithium</b> — renally excreted<br/>"
"• <b>Levetiracetam</b> — primarily renal<br/>"
"• <b>Penicillins, cephalosporins</b> — renal excretion<br/>"
"• <b>Paracetamol ≤2 g/day</b> — safe in stable cirrhosis<br/>"
"• <b>Spironolactone, furosemide</b> — safe for ascites<br/>"
"• <b>ACE inhibitors</b> — renal clearance<br/>"
"• <b>Aminoglycosides</b> — renal, but watch for HRS", sBody),
],
]
as_table = Table(avoid_safe_data, colWidths=[87*mm, 87*mm])
as_ts = TableStyle([
("BACKGROUND", (0,0), (0,0), WARN_RED),
("BACKGROUND", (1,0), (1,0), SAFE_GREEN),
("BACKGROUND", (0,1), (0,1), WARN_LIGHT),
("BACKGROUND", (1,1), (1,1), SAFE_LIGHT),
("VALIGN", (0,0), (-1,-1), "TOP"),
("LEFTPADDING", (0,0), (-1,-1), 8),
("ROWPADDING", (0,0), (-1,-1), 6),
("BOX", (0,0), (-1,-1), 1, colors.HexColor("#BBBBBB")),
("INNERGRID", (0,0), (-1,-1), 0.5, colors.HexColor("#BBBBBB")),
])
as_table.setStyle(as_ts)
elems.append(as_table)
elems.append(Spacer(1, 4*mm))
# ── SECTION 7: GENERAL PRINCIPLES ─────────────────────────────────────────────
elems.append(section_banner("7. GENERAL PRINCIPLES OF DOSE ADJUSTMENT"))
elems.append(Spacer(1, 3*mm))
principles = [
("1. Start low, go slow", "Begin at the lowest effective dose. Titrate based on clinical response and tolerability."),
("2. Extend dosing intervals", "For drugs with prolonged half-lives, extend the interval rather than just reducing each dose."),
("3. Monitor free drug levels", "For highly protein-bound drugs (phenytoin, carbamazepine), total levels are misleading when albumin is low. Always check free levels."),
("4. Use Child-Pugh class", "Class A = minimal adjustment. Class B = significant reduction. Class C = avoid many drugs entirely."),
("5. Avoid hepatotoxic drugs", "Where safer alternatives exist, avoid drugs with known hepatotoxic potential (valproate, NSAIDs, rifampicin, INH)."),
("6. Watch for encephalopathy", "Opioids, benzodiazepines, sedatives, and psychotropics can precipitate or worsen hepatic encephalopathy. Avoid unless essential."),
("7. Monitor renal function", "Advanced cirrhosis can cause hepatorenal syndrome (HRS). Avoid nephrotoxic drugs (NSAIDs, aminoglycosides) and monitor renal function regularly."),
("8. Reassess continuously", "Hepatic function can deteriorate acutely. Reassess drug regimen frequently, especially during hospitalisation."),
("9. Drug interactions", "Liver disease impairs CYP450 enzymes — drugs normally metabolised by CYP are more affected, and enzyme inducers/inhibitors have exaggerated effects."),
("10. Oral vs. IV route", "For high-extraction drugs, the route of administration matters enormously. Oral bioavailability is greatly increased; IV doses are affected less."),
]
for num, (title, detail) in enumerate(principles):
bg = LIGHT_BLUE if num % 2 == 0 else WHITE
p_data = [[Paragraph(f"<b>{title}</b>", sBody), Paragraph(detail, sBody)]]
p_t = Table(p_data, colWidths=[55*mm, 117*mm])
p_t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "TOP"),
("LINEBELOW", (0,0), (-1,-1), 0.3, colors.HexColor("#CCCCCC")),
]))
elems.append(p_t)
elems.append(Spacer(1, 4*mm))
# ── SECTION 8: MEMORY AIDS ────────────────────────────────────────────────────
elems.append(section_banner("8. EXAM MEMORY AIDS & HIGH-YIELD POINTS"))
elems.append(Spacer(1, 3*mm))
mem_data = [
[Paragraph("Topic", sTableHead), Paragraph("High-Yield Fact / Mnemonic", sTableHead)],
["Safe BZDs", "'LOT' — Lorazepam, Oxazepam, Temazepam (glucuronidation only — no active metabolites, CYP-independent)"],
["Safe NMBAs", "Atracurium + Cisatracurium — Hofmann elimination: liver/kidney INDEPENDENT"],
["Safe opioid", "Remifentanil — esterase metabolism; PK unchanged in liver failure AND during anhepatic phase of transplant"],
["Avoid opioid", "Pethidine → norpethidine toxicity (seizures). NEVER use in liver disease."],
["Phenytoin trap", "↓Albumin → ↑free phenytoin. Total level NORMAL = falsely reassuring. Check FREE level."],
["Propranolol oral", "Cirrhosis bypasses portal first-pass → oral bioavailability 2–3×. Reduce oral dose markedly."],
["Warfarin", "PT/INR already elevated in cirrhosis. Drug is hypersensitive. Closely monitor."],
["Encephalopathy drugs", "Opioids + BZDs + sedatives → can precipitate/worsen hepatic encephalopathy. Minimise."],
["Child-Pugh A/B/C", "A (5–6) = mild. B (7–9) = moderate. C (10–15) = severe. BAPES scoring: Bilirubin, Albumin, PT, Encephalopathy, asciteS"],
["Insulin vs tablets", "Insulin is preferred over oral hypoglycaemics in liver disease — not hepatically metabolised."],
["Metformin", "Lactic acidosis risk in liver disease — AVOID."],
["Lidocaine infusion", "Flow-limited clearance. Reduce rate significantly in cirrhosis. CNS toxicity risk."],
["Succinylcholine", "↓Pseudocholinesterase in cirrhosis → mild prolongation; usually clinically insignificant."],
["Spironolactone", "Safe and first-line for hepatic ascites — standard of care."],
]
mem_table = Table(mem_data, colWidths=[46*mm, 126*mm])
mem_ts = TableStyle([
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#4A235A")),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("ALIGN", (0,0), (-1,-1), "LEFT"),
("VALIGN", (0,0), (-1,-1), "TOP"),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, colors.HexColor("#F3E5F5")]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#BBBBBB")),
("LEFTPADDING", (0,0), (-1,-1), 6),
("ROWPADDING", (0,0), (-1,-1), 5),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("FONTNAME", (0,1), (0,-1), "Helvetica-Bold"),
("TEXTCOLOR", (0,1), (0,-1), colors.HexColor("#4A235A")),
])
mem_table.setStyle(mem_ts)
elems.append(mem_table)
elems.append(PageBreak())
# ── SECTION 9: 10-MARK MODEL ANSWER ──────────────────────────────────────────
elems.append(section_banner("9. MODEL 10-MARK EXAM ANSWER STRUCTURE"))
elems.append(Spacer(1, 3*mm))
elems.append(info_box(
"Structure your 10-mark answer with these headings (2 marks each or as indicated). "
"Write in flowing paragraphs under each heading; avoid bare bullet points in long-answer exams."
))
elems.append(Spacer(1, 3*mm))
outline_data = [
[Paragraph("Heading", sTableHead), Paragraph("Key Content", sTableHead), Paragraph("Marks", sTableHead)],
["Introduction", "Liver as primary metabolic organ; PK mechanisms affected; no single lab test; Child-Pugh as surrogate", "1"],
["PK Changes (mechanisms)", "↓ hepatic blood flow, ↓ hepatocellular mass, ↓ albumin (↑ free fraction), ↑ Vd, ↓ CYP450, portosystemic shunting", "2"],
["High vs. Low Extraction Ratio",
"Flow-limited (E>0.7): affected by blood flow, oral bioavailability ↑↑ — e.g., propranolol, morphine, lidocaine. "
"Capacity-limited (E<0.3): affected by enzyme activity/protein binding — e.g., warfarin, diazepam, phenytoin", "2"],
["Child-Pugh Classification", "5 parameters (bilirubin, albumin, PT, ascites, encephalopathy); Classes A/B/C with dosing implications", "1"],
["Drug-specific adjustments\n(4–5 examples)",
"e.g., Pethidine: AVOID (norpethidine toxicity). Remifentanil: safe. Atracurium: safe. LOT benzodiazepines: preferred. "
"Phenytoin: check free level. Propranolol: reduce oral dose. Paracetamol: ≤2 g/day. Valproate: avoid.", "3"],
["General Principles", "Start low, go slow; extend intervals; monitor free levels; avoid hepatotoxics; watch encephalopathy; monitor renal function", "1"],
]
outline_table = Table(outline_data, colWidths=[44*mm, 113*mm, 15*mm])
outline_ts = TableStyle([
("BACKGROUND", (0,0), (-1,0), DARK_BLUE),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("ALIGN", (0,0), (-1,-1), "LEFT"),
("ALIGN", (2,0), (2,-1), "CENTER"),
("VALIGN", (0,0), (-1,-1), "TOP"),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, LIGHT_BLUE]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#BBBBBB")),
("LEFTPADDING", (0,0), (-1,-1), 6),
("ROWPADDING", (0,0), (-1,-1), 5),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("FONTNAME", (2,1), (2,-1), "Helvetica-Bold"),
("TEXTCOLOR", (2,1), (2,-1), DARK_BLUE),
("FONTSIZE", (2,1), (2,-1), 10),
])
outline_table.setStyle(outline_ts)
elems.append(outline_table)
elems.append(Spacer(1, 4*mm))
# ── SECTION 10: MCQ PRACTICE ───────────────────────────────────────────────────
elems.append(section_banner("10. HIGH-YIELD MCQ POINTS"))
elems.append(Spacer(1, 3*mm))
mcq_items = [
("Q: Which NMBA is safe in severe liver AND renal failure?",
"A: Atracurium or cisatracurium (Hofmann elimination, organ-independent)"),
("Q: Which opioid is safest in end-stage liver disease?",
"A: Remifentanil (esterase-metabolised; PK unchanged even in anhepatic phase)"),
("Q: Why is pethidine contraindicated in liver disease?",
"A: Norpethidine (toxic metabolite) accumulates → seizures, CNS toxicity"),
("Q: Why is total phenytoin level misleading in cirrhosis?",
"A: ↓Albumin → ↑free phenytoin. Total level normal but free (active) level may be toxic"),
("Q: Which BZDs are preferred in liver disease and why?",
"A: Lorazepam, Oxazepam, Temazepam (LOT) — glucuronidation only, no active metabolites, CYP-independent"),
("Q: Why does oral propranolol have increased effect in cirrhosis?",
"A: Portosystemic shunting bypasses first-pass hepatic metabolism → 2–3× higher oral bioavailability"),
("Q: Child-Pugh Class C score range?",
"A: 10–15 (severe hepatic impairment; many drugs contraindicated)"),
("Q: Which antidiabetic is preferred in hepatic disease?",
"A: Insulin (not hepatically metabolised). Avoid metformin (lactic acidosis) and sulfonylureas (prolonged hypoglycaemia)"),
("Q: Which parameter of phenytoin should be monitored in hypoalbuminaemia?",
"A: FREE (unbound) phenytoin level"),
("Q: What is the max safe daily paracetamol dose in stable cirrhosis?",
"A: 2 g/day (avoid in alcoholic hepatitis or acute liver failure)"),
]
for i, (q, a) in enumerate(mcq_items):
bg = LIGHT_TEAL if i % 2 == 0 else WHITE
mcq_row = [[Paragraph(q, S("q", fontSize=8.5, leading=12, textColor=DARK_BLUE, fontName="Helvetica-Bold")),
Paragraph(a, S("a", fontSize=8.5, leading=12, textColor=GREY_DARK, fontName="Helvetica"))]]
mcq_t = Table(mcq_row, colWidths=[80*mm, 92*mm])
mcq_t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("LEFTPADDING", (0,0), (-1,-1), 7),
("RIGHTPADDING", (0,0), (-1,-1), 5),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("VALIGN", (0,0), (-1,-1), "TOP"),
("LINEBELOW", (0,0), (-1,-1), 0.3, colors.HexColor("#CCCCCC")),
]))
elems.append(mcq_t)
elems.append(Spacer(1, 4*mm))
# ── Footer note ───────────────────────────────────────────────────────────────
elems.append(HRFlowable(width="100%", thickness=1, color=MED_BLUE))
elems.append(Spacer(1, 2*mm))
elems.append(Paragraph(
"Sources: Barash Clinical Anesthesia 9e | Miller's Anesthesia 10e | Tietz Laboratory Medicine 7e | "
"Sabiston Textbook of Surgery | Maudsley Prescribing Guidelines 15e | Lippincott Pharmacology. "
"Prepared by Orris Medical AI • For exam preparation only — verify clinical decisions with current guidelines.",
S("footer", fontSize=7.5, leading=10, textColor=colors.HexColor("#888888"),
fontName="Helvetica-Oblique", alignment=TA_CENTER)
))
# ── Build ─────────────────────────────────────────────────────────────────────
doc.build(elems)
print(f"PDF generated: {OUTPUT}")
cd /tmp/workspace/hepatic-dose-guide && python generate_pdf.py 2>&1
ls -lh /tmp/workspace/hepatic-dose-guide/Hepatic_Dose_Adjustment_Study_Guide.pdf
Hepatic Dose Adjustment Study Guide
PDF Document · PDF
| Section | Content |
|---|---|
| 1. Why It Matters | Introduction and core rationale |
| 2. PK Changes | Full table of pharmacokinetic alterations in liver disease |
| 3. Extraction Ratio | High vs. Low extraction — the central concept, with mnemonics |
| 4. Child-Pugh Score | Full scoring table + Class A/B/C dosing implications |
| 5. Drug-Specific Tables | Opioids, BZDs/sedatives, NMBAs, cardiovascular, antibiotics, antiepileptics/psychotropics, antidiabetics/anticoagulants |
| 6. Quick-Reference | Side-by-side AVOID vs. SAFE drug lists |
| 7. General Principles | 10 core principles with colour-coded rows |
| 8. Memory Aids | High-yield mnemonics (LOT, Hofmann, remifentanil, phenytoin trap, etc.) |
| 9. 10-Mark Model Answer | Structured outline with marks breakdown |
| 10. MCQ Practice | 10 high-yield Q&A pairs |