Type 2DM management according to Indian physicians guidelines and drug pharmacology
RSSDI guidelines 2025 Type 2 diabetes management India
"type 2 diabetes" AND "India" AND "guidelines"
https://www.rssdi.in/newwebsite/page.php?id=114
"RSSDI" AND "type 2 diabetes" AND "clinical practice recommendations"
PMID: 32699774
RSSDI 2022 type 2 diabetes clinical practice recommendations algorithm stepwise treatment
https://www.rssdi.in/newwebsite/RSSDI-Clinical-Practice-Reco…
| Parameter | Diagnostic Threshold |
|---|---|
| Fasting Plasma Glucose (FPG) | ≥ 126 mg/dL (7.0 mmol/L) |
| 2-hr Post-75g OGTT | ≥ 200 mg/dL (11.1 mmol/L) |
| Random Plasma Glucose + symptoms | ≥ 200 mg/dL |
| HbA1c | ≥ 6.5% |
| Patient Category | HbA1c Target | FPG Target | 2-hr PPG Target |
|---|---|---|---|
| Young, newly diagnosed, no complications | ≤ 6.5% | 80-110 mg/dL | < 140 mg/dL |
| General T2DM patients | < 7.0% | 80-130 mg/dL | < 180 mg/dL |
| Elderly, CVD, organ failure, hypoglycemia-prone | < 8.0% | 100-140 mg/dL | < 200 mg/dL |
| Feature | Detail |
|---|---|
| Mechanism | Activates AMPK → inhibits hepatic gluconeogenesis; improves peripheral insulin sensitivity; reduces intestinal glucose absorption |
| HbA1c reduction | 1.0-2.0% |
| Effect on weight | Neutral/modest reduction |
| Hypoglycemia risk | Very low (does not stimulate insulin) |
| Key benefits | Cardioprotective, cheap, long safety record, preserves CV outcomes (UKPDS) |
| Side effects | GI: nausea, diarrhea, metallic taste (start low, titrate slowly); Vitamin B12 deficiency (long-term) |
| Safety concern | Lactic acidosis (rare - avoid in eGFR < 30, severe hepatic disease, contrast dye procedures) |
| Dosing | Start 500 mg OD/BD with food; max 2000-2500 mg/day |
| Indian note | Available in IR and SR (sustained release) formulations; SR preferred for GI tolerability |
| Feature | Detail |
|---|---|
| Mechanism | Bind ATP-sensitive K+ channels on pancreatic β-cells → cell depolarization → Ca2+ influx → insulin secretion (glucose-independent) |
| HbA1c reduction | 1.0-2.5% (highest among OADs) |
| Effect on weight | Weight gain (1-4 kg) |
| Hypoglycemia risk | High - most common class causing hypoglycemia |
| Key benefits | Highly cost-effective, potent, available at all healthcare levels in India |
| Preferred SU in India | Glimepiride and Gliclazide MR (lower hypoglycemia risk vs glibenclamide) |
| Side effects | Hypoglycemia (esp. glibenclamide in elderly), weight gain, photosensitivity |
| Caution | Avoid in elderly, renal failure (glimepiride partially safe), pregnancy; reduce dose when adding prandial insulin |
| Feature | Detail |
|---|---|
| Mechanism | Same as SU (ATP-K+ channel block) but at different binding site; short-acting, meal-stimulated |
| HbA1c reduction | 0.5-1.0% |
| Effect on weight | Weight gain |
| Hypoglycemia risk | Moderate (lower than SU due to short action) |
| Key use | Postprandial hyperglycemia, irregular meal timings (take only with meals) |
| RSSDI note | Use only when SUs are contraindicated or economic constraints preclude newer agents |
| Feature | Detail |
|---|---|
| Mechanism | PPAR-γ agonist → increased insulin sensitivity in adipose, muscle, liver; adiponectin upregulation |
| HbA1c reduction | 0.5-1.0% |
| Effect on weight | Weight gain (fluid retention) |
| Hypoglycemia risk | Very low |
| Key benefits | Preserves β-cell function; useful in insulin resistance, NAFLD/NASH |
| Contraindications | Heart failure (causes fluid retention/edema), bladder cancer (pioglitazone - controversial) |
| Side effects | Edema, weight gain, fracture risk (women), macular edema |
| Indian note | Pioglitazone is the only available TZD in India (rosiglitazone withdrawn); useful in MetS, PCOS |
| Feature | Detail |
|---|---|
| Mechanism | Inhibit dipeptidyl peptidase-4 enzyme → prevent degradation of GLP-1 and GIP → increased incretin effect → glucose-dependent insulin secretion + glucagon suppression |
| HbA1c reduction | 0.5-0.8% |
| Effect on weight | Neutral |
| Hypoglycemia risk | Low |
| Key benefits | Excellent tolerability, weight-neutral, safe in elderly and CKD (dose-adjust), no GI side effects |
| Side effects | Nasopharyngitis, UTI, rare: pancreatitis; saxagliptin: increased HF hospitalizations |
| Indian generics | Teneligliptin and Vildagliptin are widely used in India due to affordability |
| Renal dosing | Dose reduction needed for most (except linagliptin - hepatically eliminated) |
| Feature | Detail |
|---|---|
| Mechanism | Inhibit sodium-glucose co-transporter 2 in proximal tubule → block renal glucose reabsorption → glucosuria (~70g/day eliminated) |
| HbA1c reduction | 0.8-1.2% |
| Effect on weight | Weight loss (2-3 kg) |
| Hypoglycemia risk | Very low |
| Landmark trials | EMPA-REG OUTCOME (empagliflozin), CANVAS (canagliflozin), DECLARE-TIMI (dapagliflozin) - all showed CV mortality and HF hospitalization reduction |
| Key benefits | CVD risk reduction, heart failure benefit (independent of DM), renal protection, weight loss, BP reduction |
| Side effects | Genital mycotic infections (most common), UTI, DKA (rare, euglycemic), increased LDL |
| Caution | Avoid eGFR < 30 (canagliflozin < 45); increased risk of lower extremity amputation (canagliflozin); Fournier's gangrene (rare) |
| RSSDI 2022 | Preferred add-on in established ASCVD, HF, DKD - should be used irrespective of HbA1c level |
| Feature | Detail |
|---|---|
| Mechanism | GLP-1 receptor agonists → glucose-dependent insulin secretion, glucagon suppression, delayed gastric emptying, central satiety, β-cell preservation |
| HbA1c reduction | 1.0-1.5% |
| Effect on weight | Weight loss (3-6 kg; semaglutide up to 10-15%) |
| Hypoglycemia risk | Low |
| Landmark trials | LEADER (liraglutide), SUSTAIN-6 (semaglutide), REWIND (dulaglutide) - CV benefit shown |
| Key benefits | Weight loss, cardioprotective, β-cell preservation, renal protection |
| Side effects | Nausea, vomiting (common initially), higher rates of retinopathy progression (semaglutide - rapid glucose lowering effect), pancreatitis (rare), injection site reactions |
| RSSDI 2022 | Preferred in obese T2DM with ASCVD; oral semaglutide becoming available in India |
| Recent meta-analysis (PMID 39977628) | GLP-1 RAs show cardiovascular benefit in Asian populations, though the absolute effect sizes differ slightly from White populations |
| Feature | Detail |
|---|---|
| Mechanism | Inhibit intestinal alpha-glucosidase enzymes → delay carbohydrate digestion → blunt postprandial glucose rise |
| HbA1c reduction | 0.5-0.8% |
| Effect on weight | Neutral |
| Hypoglycemia risk | Very low |
| Key use | Postprandial hyperglycemia, prediabetes prevention; Voglibose popular in India |
| Side effects | Flatulence, bloating, diarrhea (GI symptoms limit compliance) |
| Note | If hypoglycemia occurs with combo therapy, treat with pure glucose - sucrose will not work (enzyme blocked) |
| Population | Recommendation |
|---|---|
| Elderly (>65 yrs) | HbA1c < 7.5-8%; avoid SU/glibenclamide; prefer DPP4i, metformin (if tolerates); relaxed targets |
| CKD | Metformin: avoid if eGFR < 30; SGLT2i for renoprotection if eGFR > 30-45; prefer linagliptin (DPP4i - no renal dose adjust) |
| CVD/ASCVD | Empagliflozin or dapagliflozin + liraglutide/semaglutide - cardioprotective |
| Heart Failure | SGLT2i are first choice; avoid TZDs and saxagliptin |
| NAFLD/Metabolic Syndrome | Pioglitazone, GLP-1 RA |
| Obese T2DM | GLP-1 RA + SGLT2i preferred; promote weight loss; bariatric surgery if BMI > 32.5 with comorbidities |
| Pregnancy | Insulin preferred; Metformin acceptable; all OADs generally avoided |
| Young T2DM (< 40 yrs) | Aggressive glycemic control, target HbA1c ≤ 6.5%; address comorbidities aggressively |
| Complication | Frequency |
|---|---|
| HbA1c | Every 3 months (uncontrolled), every 6 months (stable) |
| Retinopathy | Annually (from diagnosis) |
| Nephropathy (urine ACR + eGFR) | Annually |
| Neuropathy (foot exam) | Annually |
| CVD risk assessment | Annually |
| Lipids | At diagnosis, then annually |
| BP | Every visit |
| Drug Class | HbA1c Reduction | Weight | Hypoglycemia | β-cell Preservation | Key Use |
|---|---|---|---|---|---|
| Metformin | 1.0-2.0% | Neutral | Very low | No | First line in all |
| Sulfonylurea | 1.0-2.5% | Gain | High | No | Cost-effective |
| Meglitinide | 0.5-1.0% | Gain | Moderate | No | PPG, irregular meals |
| Pioglitazone (TZD) | 0.5-1.0% | Gain | Very low | No | IR, NAFLD |
| DPP-4i | 0.5-0.8% | Neutral | Low | No | Elderly, CKD |
| SGLT2i | 0.8-1.2% | Loss | Very low | No | CVD, HF, CKD |
| GLP-1 RA | 1.0-1.5% | Loss | Low | Yes | ASCVD, Obesity |
| AGI | 0.5-0.8% | Neutral | Very low | No | PPG, prediabetes |
| Insulin | Variable | Gain | High | No | Failure of OADs |
Create a summary PDF on T2DM drug mechanism comparison & dosing table
ls -la /home/daytona/workspace/ 2>/dev/null || echo "workspace is empty or does not exist"
mkdir -p /home/daytona/workspace/t2dm-pdf && python3 -c "import reportlab; print('reportlab ok')" && python3 -c "from reportlab.platypus import SimpleDocTemplate; print('platypus ok')"
~/t2dm-pdf/generate_t2dm_pdf.py
#!/usr/bin/env python3
"""
T2DM Drug Mechanism Comparison & Dosing Summary PDF
Based on RSSDI 2022 Clinical Practice Recommendations
"""
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import cm, mm
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, KeepTogether, PageBreak
)
from reportlab.platypus import BaseDocTemplate, Frame, PageTemplate
from reportlab.lib.colors import HexColor
from reportlab.graphics.shapes import Drawing, Rect, String
from reportlab.graphics import renderPDF
OUTPUT = "/home/daytona/workspace/t2dm-pdf/T2DM_Drug_Summary_RSSDI2022.pdf"
# --- Color Palette ---
C_NAVY = HexColor("#1B3A6B")
C_TEAL = HexColor("#0E7C7B")
C_ORANGE = HexColor("#E07B39")
C_GOLD = HexColor("#F4C542")
C_LIGHTBLUE= HexColor("#D6EAF8")
C_LIGHTTEAL= HexColor("#D0F0EF")
C_LIGHTYELLOW = HexColor("#FEF9E7")
C_LIGHTORANGE = HexColor("#FDEBD0")
C_RED = HexColor("#C0392B")
C_GREEN = HexColor("#1E8449")
C_GREY = HexColor("#717D7E")
C_LIGHTGREY= HexColor("#F2F3F4")
C_WHITE = colors.white
C_BLACK = colors.black
W, H = A4
styles = getSampleStyleSheet()
# Custom styles
def make_style(name, parent='Normal', **kwargs):
s = ParagraphStyle(name, parent=styles[parent], **kwargs)
return s
title_style = make_style('DocTitle', fontSize=22, textColor=C_WHITE,
spaceAfter=4, alignment=TA_CENTER, fontName='Helvetica-Bold')
subtitle_style = make_style('DocSub', fontSize=12, textColor=C_GOLD,
spaceAfter=2, alignment=TA_CENTER, fontName='Helvetica-Bold')
source_style = make_style('Source', fontSize=8, textColor=C_LIGHTBLUE,
spaceAfter=2, alignment=TA_CENTER, fontName='Helvetica')
section_style = make_style('Section', fontSize=13, textColor=C_WHITE,
spaceBefore=8, spaceAfter=4, fontName='Helvetica-Bold',
alignment=TA_LEFT)
body_style = make_style('Body', fontSize=9, textColor=C_BLACK,
spaceAfter=3, leading=13, fontName='Helvetica',
alignment=TA_JUSTIFY)
note_style = make_style('Note', fontSize=8, textColor=C_GREY,
spaceAfter=3, leading=11, fontName='Helvetica-Oblique',
alignment=TA_JUSTIFY)
th_style = make_style('TH', fontSize=8, textColor=C_WHITE,
fontName='Helvetica-Bold', alignment=TA_CENTER)
td_style = make_style('TD', fontSize=7.5, textColor=C_BLACK,
fontName='Helvetica', alignment=TA_LEFT, leading=10)
td_c_style = make_style('TDC', fontSize=7.5, textColor=C_BLACK,
fontName='Helvetica', alignment=TA_CENTER, leading=10)
small_style = make_style('Small', fontSize=7, textColor=C_GREY,
fontName='Helvetica', alignment=TA_CENTER)
drug_hdr_style = make_style('DrugHdr', fontSize=10, textColor=C_NAVY,
fontName='Helvetica-Bold', alignment=TA_LEFT, spaceBefore=6, spaceAfter=2)
def p(text, style=body_style):
return Paragraph(text, style)
def th(text):
return Paragraph(text, th_style)
def td(text):
return Paragraph(text, td_style)
def tdc(text):
return Paragraph(text, td_c_style)
def section_header(text):
"""Colored section banner"""
data = [[Paragraph(text, section_style)]]
t = Table(data, colWidths=[W - 4*cm])
t.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), C_NAVY),
('LEFTPADDING', (0,0), (-1,-1), 10),
('RIGHTPADDING', (0,0), (-1,-1), 10),
('TOPPADDING', (0,0), (-1,-1), 6),
('BOTTOMPADDING',(0,0), (-1,-1), 6),
('ROUNDEDCORNERS', [4]),
]))
return t
def hr():
return HRFlowable(width="100%", thickness=0.5, color=C_TEAL, spaceAfter=4, spaceBefore=4)
# ──────────────────────────────────────────────
# DOCUMENT SETUP
# ──────────────────────────────────────────────
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
topMargin=1.5*cm,
bottomMargin=1.5*cm,
leftMargin=2*cm,
rightMargin=2*cm,
title="T2DM Drug Mechanism Comparison & Dosing Table",
author="RSSDI 2022 Guidelines Summary",
subject="Type 2 Diabetes Mellitus Pharmacology"
)
story = []
# ══════════════════════════════════════════════
# COVER / TITLE BLOCK
# ══════════════════════════════════════════════
cover_data = [[
Paragraph("TYPE 2 DIABETES MELLITUS", title_style),
Paragraph("Drug Mechanism Comparison & Dosing Reference", subtitle_style),
Paragraph("Based on RSSDI Clinical Practice Recommendations 2022 | Indian Physicians' Guidelines", source_style),
]]
cover_table = Table([[
Paragraph("TYPE 2 DIABETES MELLITUS", title_style)],
[Paragraph("Drug Mechanism Comparison & Dosing Reference", subtitle_style)],
[Paragraph("Based on RSSDI Clinical Practice Recommendations 2022 | Indian Physicians' Guidelines", source_style)],
], colWidths=[W - 4*cm])
cover_table.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), C_NAVY),
('LEFTPADDING', (0,0), (-1,-1), 16),
('RIGHTPADDING', (0,0), (-1,-1), 16),
('TOPPADDING', (0,0), (-1,-1), 14),
('BOTTOMPADDING',(0,0), (-1,-1), 14),
]))
story.append(cover_table)
story.append(Spacer(1, 10))
# ══════════════════════════════════════════════
# SECTION 1: GLYCEMIC TARGETS TABLE
# ══════════════════════════════════════════════
story.append(section_header("1. INDIVIDUALIZED GLYCEMIC TARGETS (RSSDI 2022)"))
story.append(Spacer(1, 4))
gt_headers = [th("Patient Category"), th("HbA1c Target"), th("FPG (mg/dL)"), th("2-hr PPG (mg/dL)")]
gt_rows = [
[td("Young, newly diagnosed, no complications"), tdc("≤ 6.5%"), tdc("80–110"), tdc("< 140")],
[td("General T2DM (most patients)"), tdc("< 7.0%"), tdc("80–130"), tdc("< 180")],
[td("Elderly / CVD / organ failure / hypoglycemia-prone"),tdc("< 8.0%"), tdc("100–140"), tdc("< 200")],
[td("Pregnancy (pre-existing T2DM)"), tdc("< 6.5%"), tdc("< 95 FBS"), tdc("< 120")],
]
gt_data = [gt_headers] + gt_rows
gt = Table(gt_data, colWidths=[8*cm, 2.8*cm, 2.8*cm, 2.8*cm], hAlign='LEFT')
gt.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,0), C_TEAL),
('BACKGROUND', (0,1), (-1,1), C_LIGHTTEAL),
('BACKGROUND', (0,2), (-1,2), C_WHITE),
('BACKGROUND', (0,3), (-1,3), C_LIGHTTEAL),
('BACKGROUND', (0,4), (-1,4), C_WHITE),
('GRID', (0,0), (-1,-1), 0.4, C_GREY),
('ROWBACKGROUNDS', (0,1), (-1,-1), [C_LIGHTTEAL, C_WHITE]),
('TOPPADDING', (0,0), (-1,-1), 4),
('BOTTOMPADDING',(0,0), (-1,-1), 4),
('LEFTPADDING', (0,0), (-1,-1), 6),
('RIGHTPADDING', (0,0), (-1,-1), 6),
('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
]))
story.append(gt)
story.append(Spacer(1, 8))
# ══════════════════════════════════════════════
# SECTION 2: DRUG CLASSES OVERVIEW TABLE
# ══════════════════════════════════════════════
story.append(section_header("2. OHA CLASS COMPARISON AT A GLANCE (RSSDI 2022)"))
story.append(Spacer(1, 4))
ov_headers = [
th("Drug Class"), th("HbA1c↓"), th("Weight"), th("Hypo Risk"),
th("β-cell Preserve"), th("Key Advantage"), th("Main Concern")
]
ov_rows = [
[td("Biguanides\n(Metformin)"), tdc("1.0–2.0%"), tdc("Neutral"), tdc("Very Low"), tdc("No"), td("Cardioprotective\n1st-line all patients"), td("Lactic acidosis\neGFR<30 avoid")],
[td("Sulfonylureas\n(Glimepiride etc.)"), tdc("1.0–2.5%"), tdc("↑ Gain"), tdc("HIGH"), tdc("No"), td("Most potent OAD\nCost-effective"), td("Hypoglycemia\nWeight gain")],
[td("Meglitinides\n(Repaglinide)"), tdc("0.5–1.0%"), tdc("↑ Gain"), tdc("Moderate"), tdc("No"), td("Post-meal use\nIrregular meals"), td("Dosing frequency")],
[td("Thiazolidinediones\n(Pioglitazone)"),tdc("0.5–1.0%"), tdc("↑ Gain"), tdc("Very Low"), tdc("No"), td("Insulin resistance\nNAFLD, PCOS"), td("Heart failure\nEdema, fractures")],
[td("DPP-4 Inhibitors\n(Gliptins)"), tdc("0.5–0.8%"), tdc("Neutral"), tdc("Low"), tdc("No"), td("Well-tolerated\nElderly, CKD-safe"), td("Rare pancreatitis\nSaxa→HF hosp.")],
[td("SGLT-2 Inhibitors\n(Gliflozins)"), tdc("0.8–1.2%"), tdc("↓ Loss"), tdc("Very Low"), tdc("No"), td("CV+renal protect\nHF benefit"), td("Genital infections\nDKA (rare)")],
[td("GLP-1 RA\n(Injectables+Oral)"), tdc("1.0–1.5%"), tdc("↓ Loss"), tdc("Low"), tdc("YES"), td("Weight loss\nβ-cell preservation"), td("Nausea/vomiting\nRetinopathy risk")],
[td("Alpha-Glucosidase\nInhibitors (AGI)"),tdc("0.5–0.8%"), tdc("Neutral"),tdc("Very Low"), tdc("No"), td("Postprandial BG\nPrediabetes"), td("Flatulence\nBloating")],
[td("Insulin\n(All types)"), tdc("Variable"), tdc("↑ Gain"), tdc("HIGH"), tdc("No"), td("No ceiling dose\nWorks when OADs fail"), td("Hypoglycemia\nInjection burden")],
]
ov_data = [ov_headers] + ov_rows
ov_col_widths = [3.2*cm, 1.5*cm, 1.5*cm, 1.5*cm, 1.7*cm, 3.6*cm, 3.2*cm]
ov = Table(ov_data, colWidths=ov_col_widths, hAlign='LEFT')
ov.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,0), C_NAVY),
('ROWBACKGROUNDS', (0,1), (-1,-1), [C_LIGHTBLUE, C_WHITE]),
('GRID', (0,0), (-1,-1), 0.4, C_GREY),
('TOPPADDING', (0,0), (-1,-1), 4),
('BOTTOMPADDING',(0,0), (-1,-1), 4),
('LEFTPADDING', (0,0), (-1,-1), 5),
('RIGHTPADDING', (0,0), (-1,-1), 5),
('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
# Highlight GLP-1 RA row (row 7) - only class that preserves beta cells
('BACKGROUND', (0,7), (-1,7), HexColor("#E8F8F5")),
('TEXTCOLOR', (4,7), (4,7), C_GREEN),
]))
story.append(ov)
story.append(Spacer(1, 5))
story.append(p("* GLP-1 RAs are the only class with demonstrated β-cell preservation. SGLT2i and GLP-1 RAs have cardio-renal benefits beyond glucose control.", note_style))
story.append(Spacer(1, 8))
# ══════════════════════════════════════════════
# PAGE BREAK — MECHANISM & DOSING
# ══════════════════════════════════════════════
story.append(PageBreak())
# ══════════════════════════════════════════════
# SECTION 3: DETAILED MECHANISM OF ACTION
# ══════════════════════════════════════════════
story.append(section_header("3. MECHANISM OF ACTION — DETAILED"))
story.append(Spacer(1, 4))
# Define drug mechanism blocks as mini-tables
drug_mechs = [
{
"class": "METFORMIN (Biguanide)",
"color": C_LIGHTTEAL,
"hcolor": C_TEAL,
"mechanism": "Activates AMPK (AMP-activated protein kinase) in hepatocytes → inhibits hepatic gluconeogenesis (reduces fasting glucose). Also improves peripheral insulin sensitivity in muscle/adipose and reduces intestinal glucose absorption. Mild effect on gut microbiome (increases GLP-1 secretion).",
"site": "Liver (primary), Muscle, Gut",
"onset": "1–2 weeks",
"peak": "2–3 months",
},
{
"class": "SULFONYLUREAS (e.g., Glimepiride, Gliclazide MR)",
"color": HexColor("#FDEDEC"),
"hcolor": C_RED,
"mechanism": "Bind SUR1 receptor of ATP-sensitive K⁺ channels on pancreatic β-cells → channel closure → cell membrane depolarisation → voltage-gated Ca²⁺ influx → insulin exocytosis. Action is GLUCOSE-INDEPENDENT (causes hypoglycemia). 2nd generation SUs (glimepiride) have lower affinity for cardiac SUR2A, reducing cardiac risk vs. older SUs.",
"site": "Pancreatic β-cells",
"onset": "30 minutes",
"peak": "2–4 hours (varies by agent)",
},
{
"class": "MEGLITINIDES (Repaglinide, Nateglinide)",
"color": HexColor("#FEF5E7"),
"hcolor": C_ORANGE,
"mechanism": "Same ATP-K⁺ channel closure as sulfonylureas but at a DIFFERENT binding site on SUR1 → rapid, short-duration insulin release. Designed for meal-time use (prandial insulin secretagogues). Must be taken 0–30 min before each meal — skipped if meal is skipped.",
"site": "Pancreatic β-cells",
"onset": "15–30 minutes",
"peak": "1 hour; duration 3–4 hrs",
},
{
"class": "THIAZOLIDINEDIONES — Pioglitazone (PPAR-γ agonist)",
"color": C_LIGHTYELLOW,
"hcolor": HexColor("#B7950B"),
"mechanism": "Binds nuclear PPAR-γ (Peroxisome Proliferator-Activated Receptor-γ) in adipose tissue, liver, and muscle → transcriptional activation of genes controlling glucose and lipid metabolism → increased GLUT-4 expression, increased adiponectin, reduced free fatty acid flux, improved hepatic and peripheral insulin sensitivity. Slow onset — 4–8 weeks for full effect.",
"site": "Adipose (primary), Liver, Muscle",
"onset": "4–8 weeks",
"peak": "10–12 weeks",
},
{
"class": "DPP-4 INHIBITORS (Gliptins: Sitagliptin, Vildagliptin, Teneligliptin…)",
"color": C_LIGHTBLUE,
"hcolor": C_NAVY,
"mechanism": "Inhibit DPP-4 enzyme → prevent rapid degradation of endogenous incretin hormones GLP-1 and GIP → amplified incretin effect → GLUCOSE-DEPENDENT insulin secretion + glucagon suppression (only when BG is elevated). Weight-neutral because GLP-1 levels achieved are physiologic (2–3 fold increase vs. pharmacologic with GLP-1 RAs).",
"site": "Plasma (enzyme inhibition) → Pancreas",
"onset": "1–2 weeks",
"peak": "4–8 weeks",
},
{
"class": "SGLT-2 INHIBITORS (Dapagliflozin, Empagliflozin, Canagliflozin)",
"color": HexColor("#E8F8F5"),
"hcolor": C_TEAL,
"mechanism": "Block sodium-glucose co-transporter 2 (SGLT-2) in S1 segment of proximal renal tubule → reduces renal glucose reabsorption threshold from ~180 mg/dL to ~50 mg/dL → urinary glucose excretion (~70–80 g/day). Additional benefits: osmotic diuresis + natriuresis (↓BP, ↓preload/afterload in HF), reduced glucagon secretion, possible ketone body utilisation in cardiac muscle.",
"site": "Proximal renal tubule (S1 segment)",
"onset": "Days",
"peak": "2–4 weeks; renal effects early",
},
{
"class": "GLP-1 RECEPTOR AGONISTS (Liraglutide, Semaglutide, Dulaglutide, Exenatide)",
"color": HexColor("#F9F0FF"),
"hcolor": HexColor("#6C3483"),
"mechanism": "Bind and activate GLP-1 receptors (GPCRs) → (1) Pancreatic β-cells: GLUCOSE-DEPENDENT insulin secretion via cAMP/PKA; (2) α-cells: glucagon suppression; (3) Gastric: delayed emptying → blunted PPG rise; (4) Hypothalamus: satiety signaling → reduced appetite/weight. Long-acting analogues (semaglutide, dulaglutide) resist DPP-4 degradation. CV benefit via GLP-1R on cardiac/endothelial tissue (anti-inflammatory, anti-atherogenic).",
"site": "Pancreas, GI tract, Brain, Cardiovascular",
"onset": "Weeks for glucose; months for weight/CV",
"peak": "Sustained (long-acting agents)",
},
{
"class": "ALPHA-GLUCOSIDASE INHIBITORS (Acarbose, Voglibose, Miglitol)",
"color": HexColor("#FDFEFE"),
"hcolor": C_GREY,
"mechanism": "Competitively inhibit intestinal brush-border alpha-glucosidase enzymes (maltase, sucrase, glucoamylase) → slow hydrolysis of oligosaccharides/disaccharides to monosaccharides → delayed carbohydrate absorption → blunted postprandial glucose spike. Purely luminal action; minimal systemic absorption (miglitol absorbed but still acts locally).",
"site": "Intestinal brush border (luminal)",
"onset": "With each meal",
"peak": "Immediate (meal-time)",
},
]
for dm in drug_mechs:
# Header row
hdr_data = [[Paragraph(dm["class"], make_style('DMH', fontSize=9, textColor=C_WHITE,
fontName='Helvetica-Bold', alignment=TA_LEFT))]]
hdr_t = Table(hdr_data, colWidths=[W - 4*cm])
hdr_t.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), dm["hcolor"]),
('LEFTPADDING', (0,0), (-1,-1), 8),
('TOPPADDING', (0,0), (-1,-1), 4),
('BOTTOMPADDING',(0,0), (-1,-1), 4),
]))
# Body
body_data = [
[Paragraph("<b>Mechanism:</b> " + dm["mechanism"], td_style)],
[Paragraph(f"<b>Primary site:</b> {dm['site']} <b>Onset:</b> {dm['onset']} <b>Full effect:</b> {dm['peak']}", td_style)],
]
body_t = Table(body_data, colWidths=[W - 4*cm])
body_t.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), dm["color"]),
('LEFTPADDING', (0,0), (-1,-1), 8),
('RIGHTPADDING', (0,0), (-1,-1), 8),
('TOPPADDING', (0,0), (-1,-1), 4),
('BOTTOMPADDING',(0,0), (-1,-1), 4),
('GRID', (0,0), (-1,-1), 0.3, C_GREY),
]))
story.append(KeepTogether([hdr_t, body_t, Spacer(1, 3)]))
story.append(Spacer(1, 8))
# ══════════════════════════════════════════════
# PAGE BREAK — DOSING TABLE
# ══════════════════════════════════════════════
story.append(PageBreak())
# ══════════════════════════════════════════════
# SECTION 4: DOSING TABLE
# ══════════════════════════════════════════════
story.append(section_header("4. DOSING REFERENCE TABLE (Indian Formulary / RSSDI 2022)"))
story.append(Spacer(1, 4))
d_headers = [
th("Drug (Brand examples)"), th("Starting Dose"), th("Usual Dose"), th("Max Dose"),
th("Frequency"), th("Special Dosing Notes")
]
dose_rows = [
# METFORMIN
[
td("<b>METFORMIN</b>\n(Glucophage, Glycomet, Obimet)"),
tdc("500 mg OD\nwith food"),
tdc("1000 mg BD"),
tdc("2500–3000 mg/day"),
tdc("BD–TID\n(SR: OD–BD)"),
td("Take with meals. SR formulation preferred for GI tolerance. eGFR 30-45: use with caution; avoid <30.")
],
# GLIMEPIRIDE
[
td("<b>GLIMEPIRIDE</b>\n(Amaryl, Glimepil)"),
tdc("1–2 mg OD"),
tdc("2–4 mg OD"),
tdc("8 mg/day"),
tdc("OD before\nbreakfast"),
td("Start low in elderly. Reduce dose when adding prandial insulin. eGFR <30: avoid or use 1 mg cautiously.")
],
# GLICLAZIDE MR
[
td("<b>GLICLAZIDE MR</b>\n(Diamicron MR)"),
tdc("30 mg OD"),
tdc("60–90 mg OD"),
tdc("120 mg/day"),
tdc("OD with\nbreakfast"),
td("Modified-release; lower hypoglycemia risk than glibenclamide. Preferred SU in elderly & mild CKD.")
],
# REPAGLINIDE
[
td("<b>REPAGLINIDE</b>\n(Novonorm, Repace)"),
tdc("0.5 mg\nbefore meals"),
tdc("1–2 mg\nbefore meals"),
tdc("16 mg/day"),
tdc("TID\n(before meals)"),
td("Take 0–30 min before each meal. Skip dose if meal is skipped. Useful in irregular meal patterns.")
],
# PIOGLITAZONE
[
td("<b>PIOGLITAZONE</b>\n(Actos, Piosafe)"),
tdc("15 mg OD"),
tdc("30 mg OD"),
tdc("45 mg/day"),
tdc("OD\n(any time)"),
td("4–8 weeks for effect. Avoid in heart failure, active bladder cancer, hepatic impairment (ALT >2.5×ULN). Monitor weight/edema.")
],
# SITAGLIPTIN
[
td("<b>SITAGLIPTIN</b>\n(Januvia, Istavel)"),
tdc("100 mg OD"),
tdc("100 mg OD"),
tdc("100 mg/day"),
tdc("OD\n(any time)"),
td("eGFR 30-45: reduce to 50 mg OD. eGFR <30 or ESRD: 25 mg OD. No food restrictions.")
],
# VILDAGLIPTIN
[
td("<b>VILDAGLIPTIN</b>\n(Galvus, Zomelis)"),
tdc("50 mg OD"),
tdc("50 mg BD"),
tdc("100 mg/day"),
tdc("BD\n(AM+PM)"),
td("eGFR <50: 50 mg OD only. Avoid in hepatic impairment. Most widely used gliptin in India.")
],
# TENELIGLIPTIN
[
td("<b>TENELIGLIPTIN</b>\n(Teneza, Ziten)"),
tdc("20 mg OD"),
tdc("20 mg OD"),
tdc("40 mg/day"),
tdc("OD\n(before/after meals)"),
td("India-specific DPP-4i. Cost-effective. No dose adjustment for mild-moderate CKD. Hepatic: caution.")
],
# DAPAGLIFLOZIN
[
td("<b>DAPAGLIFLOZIN</b>\n(Forxiga, Dapaglyn)"),
tdc("10 mg OD"),
tdc("10 mg OD"),
tdc("10 mg/day"),
tdc("OD\n(morning)"),
td("Avoid if eGFR <30 (glycemic effect lost; HF benefit maintained). Hold before surgery. Genital hygiene counseling essential.")
],
# EMPAGLIFLOZIN
[
td("<b>EMPAGLIFLOZIN</b>\n(Jardiance, Empaglu)"),
tdc("10 mg OD"),
tdc("10–25 mg OD"),
tdc("25 mg/day"),
tdc("OD\n(morning)"),
td("CV mortality benefit (EMPA-REG). Avoid eGFR <30. HF benefit independent of DM. Hold 3–4 days pre-surgery (DKA risk).")
],
# LIRAGLUTIDE
[
td("<b>LIRAGLUTIDE</b>\n(Victoza) — Injectable"),
tdc("0.6 mg SC OD\n× 1 week"),
tdc("1.2 mg SC OD"),
tdc("1.8 mg SC OD"),
tdc("OD SC injection\n(any time)"),
td("Pen injector. Titrate weekly to reduce nausea. LEADER trial: ↓CV mortality. Refrigerate (2-8°C). In-use pen: room temp up to 30 days.")
],
# SEMAGLUTIDE ORAL
[
td("<b>SEMAGLUTIDE oral</b>\n(Rybelsus)"),
tdc("3 mg OD\n× 30 days"),
tdc("7 mg OD\n(or 14 mg)"),
tdc("14 mg/day"),
tdc("OD — fasting\n30 min before food"),
td("Take on empty stomach with ≤120 mL water, 30 min before food/drink/meds. If missed >1 dose, restart titration. Growing availability in India.")
],
# ACARBOSE
[
td("<b>ACARBOSE</b>\n(Glucobay, Glyset)"),
tdc("25 mg OD\nwith meals"),
tdc("50 mg TID"),
tdc("300 mg/day"),
tdc("TID\n(with 1st bite)"),
td("Take at start of each meal. Titrate slowly to reduce GI side effects. If hypoglycemia occurs with combo: use GLUCOSE, NOT sucrose.")
],
# VOGLIBOSE
[
td("<b>VOGLIBOSE</b>\n(Volix, Vobose)"),
tdc("0.2 mg TID"),
tdc("0.2–0.3 mg TID"),
tdc("0.9 mg/day"),
tdc("TID\n(with meals)"),
td("Popular in India. Less GI side effects than acarbose. Used for postprandial hyperglycemia and prediabetes prevention.")
],
# INSULIN - BASAL
[
td("<b>BASAL INSULIN</b>\n(Glargine U100/U300,\nDegludec, Detemir, NPH)"),
tdc("0.1–0.2 U/kg\nat bedtime\n(or 10 U)"),
tdc("Titrate by\n+2 U q3 days"),
tdc("No ceiling;\nindividualize"),
tdc("OD (Glargine,\nDegludec)\nor BD (NPH)"),
td("Target FPG 80–130 mg/dL. If hypoglycemia: reduce by 4 U or 10%. Degludec: lower nocturnal hypo risk. Can combine with GLP-1 RA (IDegLira, iGlarLixi).")
],
# INSULIN - PREMIXED
[
td("<b>PREMIXED INSULIN</b>\n(30/70, 50/50 analogs:\nNovomix, Humalog Mix)"),
tdc("6–10 U before\nlargest meal"),
tdc("0.3–0.5 U/kg/day\nsplit BD"),
tdc("Individualize"),
tdc("BD–TID\nbefore meals"),
td("Analogue premixes (aspart/lispro mixes) preferred: faster onset, lower PPG. Mix before injection for human insulin. Refrigerate.")
],
]
d_data = [d_headers] + dose_rows
d_col = [3.8*cm, 2.2*cm, 2.2*cm, 2.0*cm, 1.8*cm, 4.2*cm]
d_table = Table(d_data, colWidths=d_col, hAlign='LEFT')
# Row colors
d_style_cmds = [
('BACKGROUND', (0,0), (-1,0), C_NAVY),
('GRID', (0,0), (-1,-1), 0.4, C_GREY),
('TOPPADDING', (0,0), (-1,-1), 4),
('BOTTOMPADDING', (0,0), (-1,-1), 4),
('LEFTPADDING', (0,0), (-1,-1), 5),
('RIGHTPADDING', (0,0), (-1,-1), 5),
('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
]
# Alternate row colors by drug class
class_colors = {
1: HexColor("#D5F5E3"), # Metformin - green
2: HexColor("#FDEDEC"), # Glimepiride - red
3: HexColor("#FDEDEC"), # Gliclazide
4: HexColor("#FEF5E7"), # Repaglinide - orange
5: HexColor("#FEF9E7"), # Pioglitazone - yellow
6: C_LIGHTBLUE, # Sitagliptin - blue
7: C_LIGHTBLUE, # Vildagliptin
8: C_LIGHTBLUE, # Teneligliptin
9: HexColor("#E8F8F5"), # Dapagliflozin - teal
10: HexColor("#E8F8F5"), # Empagliflozin
11: HexColor("#F9F0FF"), # Liraglutide - purple
12: HexColor("#F9F0FF"), # Semaglutide
13: HexColor("#F8F9FA"), # Acarbose - grey
14: HexColor("#F8F9FA"), # Voglibose
15: HexColor("#EBF5FB"), # Basal insulin
16: HexColor("#EBF5FB"), # Premixed insulin
}
for row_i, row_color in class_colors.items():
d_style_cmds.append(('BACKGROUND', (0, row_i), (-1, row_i), row_color))
d_table.setStyle(TableStyle(d_style_cmds))
story.append(d_table)
story.append(Spacer(1, 6))
# ══════════════════════════════════════════════
# PAGE BREAK — Special Populations + ABCD
# ══════════════════════════════════════════════
story.append(PageBreak())
# ══════════════════════════════════════════════
# SECTION 5: DRUG SELECTION BY COMORBIDITY
# ══════════════════════════════════════════════
story.append(section_header("5. DRUG SELECTION BY COMORBIDITY — ABCD(EFGH) Approach (RSSDI 2022)"))
story.append(Spacer(1, 4))
cm_headers = [th("Clinical Condition"), th("Preferred Agents"), th("Avoid / Caution")]
cm_rows = [
[td("<b>Established ASCVD / High CV Risk</b>"),
td("Empagliflozin or Dapagliflozin (SGLT2i)\nLiraglutide or Semaglutide (GLP-1 RA)"),
td("Pioglitazone (fluid retention)\nSaxagliptin (↑HF hospitalization)")],
[td("<b>Heart Failure (HFrEF / HFpEF)</b>"),
td("Dapagliflozin / Empagliflozin\n(HF benefit independent of DM)"),
td("Pioglitazone (TZD) — CONTRAINDICATED\nSaxagliptin — AVOID")],
[td("<b>CKD (Diabetic Kidney Disease)</b>"),
td("SGLT2i (renoprotective; use if eGFR>30)\nLinagliptin (no renal dose adj.)\nGLP-1 RA (dose-adjust for exenatide)"),
td("Metformin: AVOID eGFR <30\nSulfonylureas: Avoid in severe CKD\nCanagliflozin: Avoid eGFR <45")],
[td("<b>Obesity / Weight Reduction Goal</b>"),
td("GLP-1 RA (semaglutide > liraglutide)\nSGLT2i (modest loss 2–3 kg)\nMetformin (weight-neutral/↓)"),
td("Sulfonylureas (weight gain)\nInsulin (weight gain)\nPioglitazone (weight + edema)")],
[td("<b>NAFLD / Insulin Resistance / PCOS</b>"),
td("Pioglitazone (PPAR-γ for NASH)\nGLP-1 RA (hepatic fat reduction)\nMetformin (first line in PCOS)"),
td("No absolute contraindications;\nMonitor LFTs with pioglitazone")],
[td("<b>Elderly Patients (>65 years)</b>"),
td("DPP-4i (weight-neutral, low hypo)\nMetformin (if tolerated)\nGliclazide MR (safer SU)"),
td("Glibenclamide (prolonged hypoglycemia)\nTight targets (HbA1c <8% acceptable)\nInsulin: simplify regimens")],
[td("<b>Postprandial Hyperglycemia (PPH)</b>"),
td("AGI (acarbose, voglibose)\nDPP-4i\nGLP-1 RA (exenatide)\nGlinides (repaglinide)"),
td("Basal insulin alone (does not\naddress PPH adequately)")],
[td("<b>Pregnancy / Preconception</b>"),
td("Insulin (all types - preferred)\nMetformin (acceptable, some studies)"),
td("All OADs except metformin — AVOID\nGLP-1 RA: insufficient data\nSGLT2i: AVOID")],
[td("<b>Hypoglycemia-Prone Patients</b>"),
td("DPP-4i, SGLT2i, GLP-1 RA, AGI\nMetformin, Pioglitazone"),
td("Sulfonylureas — HIGH risk\nGlinides — moderate risk\nInsulin — careful titration needed")],
]
cm_data = [cm_headers] + cm_rows
cm_col = [4.5*cm, 6.5*cm, 5.2*cm]
cm_table = Table(cm_data, colWidths=cm_col, hAlign='LEFT')
cm_table.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,0), C_TEAL),
('ROWBACKGROUNDS',(0,1), (-1,-1), [C_LIGHTBLUE, C_WHITE]),
('GRID', (0,0), (-1,-1), 0.4, C_GREY),
('TOPPADDING', (0,0), (-1,-1), 5),
('BOTTOMPADDING',(0,0), (-1,-1), 5),
('LEFTPADDING', (0,0), (-1,-1), 6),
('RIGHTPADDING', (0,0), (-1,-1), 6),
('VALIGN', (0,0), (-1,-1), 'TOP'),
]))
story.append(cm_table)
story.append(Spacer(1, 8))
# ══════════════════════════════════════════════
# SECTION 6: INSULIN TYPES TABLE
# ══════════════════════════════════════════════
story.append(section_header("6. INSULIN TYPES — ONSET, PEAK & DURATION"))
story.append(Spacer(1, 4))
ins_headers = [th("Insulin Type"), th("Examples (India)"), th("Onset"), th("Peak"), th("Duration"), th("Key Use")]
ins_rows = [
[td("<b>Rapid-Acting Analogue</b>"), td("Aspart (NovoRapid)\nLispro (Humalog)\nGlulisine (Apidra)"),
tdc("10–20 min"), tdc("1–2 hr"), tdc("3–5 hr"), td("Prandial (mealtime); basal-bolus regimens")],
[td("<b>Short-Acting (Regular)</b>"), td("Actrapid HM\nHumulin R"),
tdc("30–60 min"), tdc("2–4 hr"), tdc("6–8 hr"), td("Prandial; IV in DKA/HHS; 30 min before meals")],
[td("<b>Intermediate (NPH)</b>"), td("Insulatard\nHumulin N"),
tdc("2–4 hr"), tdc("4–10 hr"), tdc("12–18 hr"), td("Twice-daily; bedtime dosing; affordable")],
[td("<b>Long-Acting Analogue</b>"), td("Glargine U100 (Lantus)\nGlargine U300 (Toujeo)\nDetemir (Levemir)"),
tdc("2–4 hr"), tdc("Peakless\n(flat profile)"), tdc("20–24 hr"), td("Basal once daily; lower nocturnal hypo risk")],
[td("<b>Ultra-Long Acting</b>"), td("Degludec U100/U200\n(Tresiba)"),
tdc("30–90 min"), tdc("Peakless"), tdc(">42 hr"), td("Once daily; very low variability; HF/CKD safe")],
[td("<b>Premixed (Human)</b>"), td("Mixtard 30/70\nHumulin 70/30"),
tdc("30 min"), tdc("2–8 hr"), tdc("Up to 24 hr"), td("BD before breakfast & dinner; cost-effective")],
[td("<b>Premixed Analogue</b>"), td("NovoMix 30, 50, 70\nHumalog Mix 25, 50"),
tdc("10–20 min"), tdc("1–4 hr"), tdc("Up to 24 hr"), td("More flexible meals; lower PPG vs. human premix")],
[td("<b>Co-formulation\n(Basal+GLP-1)</b>"), td("IDegLira (Xultophy)\niGlarLixi (Suliqua)"),
tdc("Combined"), tdc("Combined"), tdc("Combined"), td("Lower hypoglycemia + weight benefit vs. basal alone; RSSDI recommended for intensification")],
]
ins_data = [ins_headers] + ins_rows
ins_col = [3.5*cm, 3.5*cm, 1.6*cm, 1.8*cm, 2.0*cm, 3.8*cm]
ins_table = Table(ins_data, colWidths=ins_col, hAlign='LEFT')
ins_table.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,0), C_NAVY),
('ROWBACKGROUNDS',(0,1), (-1,-1), [HexColor("#EBF5FB"), C_WHITE]),
('GRID', (0,0), (-1,-1), 0.4, C_GREY),
('TOPPADDING', (0,0), (-1,-1), 4),
('BOTTOMPADDING',(0,0), (-1,-1), 4),
('LEFTPADDING', (0,0), (-1,-1), 5),
('RIGHTPADDING', (0,0), (-1,-1), 5),
('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
('BACKGROUND', (0,8), (-1,8), HexColor("#D5F5E3")), # co-formulation highlight
]))
story.append(ins_table)
story.append(Spacer(1, 8))
# ══════════════════════════════════════════════
# FOOTER NOTE
# ══════════════════════════════════════════════
story.append(hr())
footer_text = (
"<b>Source:</b> RSSDI Clinical Practice Recommendations for the Management of Type 2 Diabetes Mellitus 2022 "
"(Int J Diabetes Dev Ctries 2022; PMC9534592) | RSSDI-ESI 2020 (PMID 32699774) | Textbook of Family Medicine 9e. "
"Dosing reflects Indian formulary availability. Individualize all therapy. This document is a clinical reference — "
"not a substitute for physician judgment."
)
story.append(p(footer_text, note_style))
story.append(Spacer(1, 4))
# ══════════════════════════════════════════════
# BUILD PDF
# ══════════════════════════════════════════════
doc.build(story)
print(f"PDF created: {OUTPUT}")
cd /home/daytona/workspace/t2dm-pdf && python3 generate_t2dm_pdf.py 2>&1
ls -lh /home/daytona/workspace/t2dm-pdf/T2DM_Drug_Summary_RSSDI2022.pdf && python3 -c " from pypdf import PdfReader r = PdfReader('/home/daytona/workspace/t2dm-pdf/T2DM_Drug_Summary_RSSDI2022.pdf') print(f'Pages: {len(r.pages)}') for i, pg in enumerate(r.pages): txt = pg.extract_text()[:120].replace('\n',' ') print(f' p{i+1}: {txt}') "
T2DM Drug Summary RSSDI2022
PDF Document · PDF
| Page | Section |
|---|---|
| 1 | Cover header + Individualized Glycemic Targets table (RSSDI 2022) |
| 1 | OHA Class Comparison At-A-Glance (all 9 classes: HbA1c↓, weight, hypo risk, β-cell preservation, key advantage) |
| 2 | Detailed Mechanism of Action for each drug class - color-coded blocks (Metformin → AMPK, SU → ATP-K⁺ channels, TZD → PPAR-γ, DPP4i → incretin amplification, SGLT2i → renal glucose transport, GLP-1 RA → receptor signaling, AGI → brush-border enzymes) |
| 3–4 | Full Dosing Reference Table (16 drugs/insulins) - starting dose, usual dose, max dose, frequency, brand names, special notes including Indian formulations |
| 5 | Drug Selection by Comorbidity - ABCD(EFGH) approach: ASCVD, HF, CKD, obesity, NAFLD, elderly, postprandial hyperglycemia, pregnancy, hypoglycemia risk |
| 6 | Insulin Types table - onset, peak, duration for all types including co-formulations (IDegLira, iGlarLixi); footnote with sources |
Make a concise information about all the homoeopathic mother tinctures and their applications available
homoeopathic mother tinctures complete list applications uses materia medica
https://www.homoeopathicjournal.com/articles/2340/10-2-59-70…
homeopathic mother tinctures A-Z complete list Boericke materia medica indications clinical applications
| Mother Tincture | Source | Primary Applications |
|---|---|---|
| Echinacea angustifolia ø | Purple coneflower | Recurrent infections, immune deficiency, septicemia, lymphadenopathy, blood purifier, boils, carbuncles |
| Thuja occidentalis ø | Arbor vitae tree | Warts, condylomata, vaccinosis, sinusitis, chronic catarrh, skin growths, immune dysregulation |
| Baptisia tinctoria ø | Wild indigo | Septic fevers, typhoid, profound exhaustion, foul discharges, putrid conditions, flu with extreme malaise |
| Calendula officinalis ø | Marigold | Wounds, cuts, ulcers (topical antiseptic), surgical healing, burns, mastitis, external hemorrhage - "homoeopathic antiseptic" |
| Phytolacca decandra ø | Pokeweed | Tonsillitis, glandular swellings, mastitis, rheumatism, syphilitic complaints, mumps |
| Pyrogenium ø (nosode) | Decomposed beef | Septicemia, puerperal fever, foetid discharges, conditions not responding to well-chosen remedies, post-surgical sepsis |
| Ocimum sanctum ø | Holy basil (Tulsi) | Fever, recurrent infections, respiratory infections, immune stimulant, antibacterial, antiviral |
| Mother Tincture | Source | Primary Applications |
|---|---|---|
| Crataegus oxyacantha ø | Hawthorn berry | Cardiac weakness, hypertension, arteriosclerosis, cardiac failure, palpitations, angina - "heart tonic" |
| Digitalis purpurea ø | Foxglove | Cardiac failure, atrial fibrillation, slow irregular pulse, mitral insufficiency, dropsy with cardiac origin |
| Cactus grandiflorus ø | Night-blooming cactus | Angina pectoris, constrictive chest pain ("iron band around heart"), endocarditis, mitral stenosis, cardiac neurosis |
| Convallaria majalis ø | Lily of the valley | Rapid heart action, dyspnea, cardiac failure with edema, tobacco heart, palpitations |
| Terminalia arjuna ø | Arjuna tree | Angina pectoris, cardiac insufficiency, arteriosclerosis, hypertension, gonorrhea, heart tonic |
| Rauwolfia serpentina ø | Serpent root | Hypertension, tachycardia, anxiety-related BP elevation, insomnia from hypertension |
| Strophanthus hispidus ø | Kombe plant | Cardiac muscle weakness, dropsy, arteriosclerosis, rapid weak pulse, as a digitalis substitute |
| Spartium scoparium ø | Common broom | Arrhythmias, cardiac dropsy, rapid pulse, urinary suppression from cardiac origin |
| Adonis vernalis ø | Pheasant's eye | Cardiac weakness after influenza, mitral disease, fatty heart, renal edema with cardiac cause |
| Mother Tincture | Source | Primary Applications |
|---|---|---|
| Chelidonium majus ø | Greater celandine | Liver disorders, jaundice, hepatitis, gallstones, biliary colic, right-sided complaints, constipation, pain at right scapula |
| Cardus marianus ø (Silybum) | Milk thistle | Liver cirrhosis, hepatitis, portal congestion, varicose veins, liver protection, alcoholic liver disease |
| Berberis vulgaris ø | Barberry | Liver and kidney disorders, gallstones, kidney stones, urinary calculi, renal colic, jaundice, portal congestion |
| Taraxacum ø | Dandelion | Liver congestion, bilious headaches, tongue mapped, constipation, flatulence, general liver tonic |
| Nux vomica ø | Poison nut | Dyspepsia, constipation, alcoholism, drug effects, irritable bowel, liver disorders, hemorrhoids |
| Lycopodium clavatum ø | Club moss | Right-sided liver disorders, flatulence, acidity, gastroesophageal complaints, chronic liver disease |
| Hydrastis canadensis ø | Goldenseal | Catarrhal states, thick yellow discharges, gastritis, constipation, cancer tendency, liver disorders, uterine hemorrhage |
| Aloe socotrina ø | Aloe | Colitis, chronic diarrhea, portal congestion, hemorrhoids, flatulence, irritable bowel syndrome |
| Carduus marianus ø | Same as Cardus marianus - see above | |
| Myrica cerifera ø | Bayberry | Jaundice, liver congestion, lethargy, cold hands and feet, catarrhal jaundice |
| Picrorhiza kurroa ø | Katuki | Liver disease, jaundice, hepatitis, antimalarial, immune stimulant (widely used in Indian homoeopathy) |
| Chionanthus virginica ø | Fringe tree | Liver enlargement, jaundice, catarrhal jaundice, biliary lithiasis, portal obstruction, diabetes |
| Mother Tincture | Source | Primary Applications |
|---|---|---|
| Berberis vulgaris ø | Barberry | Renal calculi, urinary colic, hematuria, urinary burning, UTI (also listed under liver) |
| Pareira brava ø | Velvet leaf | Calculous affections, difficult urination, chronic cystitis, renal and vesical irritability, gonorrhea |
| Cantharis vesicatoria ø | Spanish fly | Cystitis, urethritis, nephritis, intense burning during urination, frequent urgent urge, scalding urine, burns topically |
| Solidago virgaurea ø | Goldenrod | Kidney disorders, dysuria, hematuria, renal calculi, dropsy from kidney disease, chronic nephritis |
| Uva ursi ø | Bearberry | Cystitis, urethritis, UTI, burning on urination, blood in urine, chronic nephritis |
| Senecio aureus ø | Golden groundsel | Urinary disorders with amenorrhea, vicarious menstruation from kidney, dysmenorrhea, renal irritation |
| Hydrangea arborescens ø | Wild hydrangea | Urinary calculi, gravel, dysuria, enlarged prostate with calculous deposits |
| Mother Tincture | Source | Primary Applications |
|---|---|---|
| Justicia adhatoda ø | Malabar nut (Adulsa) | Acute bronchitis, asthma, cough with profuse catarrh, spasmodic cough, influenza - one of the most used respiratory tinctures in India |
| Blatta orientalis ø | Indian cockroach | Bronchial asthma (especially when Arsenicum fails), emphysema, dyspnea |
| Ipecacuanha ø | Ipecac plant | Asthma, persistent nausea with cough, whooping cough, bronchitis, hemorrhage with nausea |
| Grindelia robusta ø | Gumplant | Asthma, bronchitis, emphysema, post-tussive nausea, foamy mucus, smothering on lying down |
| Lobelia inflata ø | Indian tobacco | Asthma, tobacco addiction withdrawal, bronchitis, nausea, emetic, cardiac dyspnea |
| Drosera rotundifolia ø | Sundew | Whooping cough, spasmodic laryngitis, deep hoarse cough, croup, laryngo-tracheal irritation |
| Senega ø | Snakeroot | Bronchial catarrh, pneumonia (later stages), emphysema, profuse mucous, old people's cough |
| Sticta pulmonaria ø | Lungwort | Catarrh of respiratory tract, constant pressure at root of nose, dry hacking cough, frontal sinusitis |
| Bryonia alba ø | Wild hops | Dry painful cough (worse movement), pleuritis, pneumonia, bronchitis with stitching chest pain |
| Eucalyptus globulus ø | Eucalyptus | Bronchitis, antiseptic respiratory conditions, chronic nasal catarrh, malaria intermittent fever |
| Inula helenium ø | Elecampane | Bronchitis, cough with bloody mucus, tenesmus of rectum and bladder, spasmodic cough |
| Mother Tincture | Source | Primary Applications |
|---|---|---|
| Avena sativa ø | Oat plant | Nervous exhaustion, neurasthenia, debility, sexual weakness, morphine/opium withdrawal, insomnia, mental fatigue - "nerve tonic" |
| Passiflora incarnata ø | Passionflower | Insomnia, restlessness, spasmodic disorders, tetanus, whooping cough, convulsions in children |
| Valeriana officinalis ø | Valerian | Nervous irritability, hysterical conditions, insomnia, palpitations from nerves, sciatica with restlessness |
| Gelsemium sempervirens ø | Yellow jasmine | Anticipatory anxiety, nervous trembling, stage fright, influenza with weakness, vertigo, diplopia |
| Ignatia amara ø | St. Ignatius bean | Grief, emotional suppression, hysterical conditions, paradoxical symptoms, nervous sighing |
| Nux moschata ø | Nutmeg | Extreme drowsiness, fainting, hysterical episodes, alternating moods, dry mouth, abdominal distension |
| Coffea cruda ø | Coffee | Oversensitivity, sleeplessness from joyous excitement, hyperalgesia, toothache relieved by cold water |
| Hypericum perforatum ø | St. John's Wort | Nerve injuries, lacerated wounds, spinal concussion, coccyx injury, neuralgia, pain in nerve-rich areas |
| Kali bromatum ø | Potassium bromide | Epilepsy, mania, sexual excess, night terrors in children, acne from sexual excesses |
| Mother Tincture | Source | Primary Applications |
|---|---|---|
| Syzygium jambolanum ø | Java plum (Jamun) | Diabetes mellitus (reduces glycosuria), polyuria, prickly heat, specific for diabetic ulcers |
| Gymnema sylvestre ø | Gurmar | Diabetes mellitus, reduces sugar craving, blood sugar regulation, obesity, metabolic syndrome |
| Momordica charantia ø | Bitter gourd (Karela) | Diabetes, hypoglycemic effect, liver support, antiparasitic |
| Abroma augusta ø | Ulat kambal | Diabetes, glycosuria, weakness, diabetic nephropathy, dysmenorrhea, uterine conditions |
| Thyroidinum ø | Thyroid gland | Hypothyroidism, obesity, cretinism, myxedema, goiter, delayed puberty |
| Iodum ø | Iodine | Thyroid disorders, goiter, glandular atrophy, hyperthyroid states with emaciation, hunger |
| Chionanthus virginica ø | Fringe tree | Diabetes with glycosuria, liver involvement, jaundice, biliary obstruction |
| Mother Tincture | Source | Primary Applications |
|---|---|---|
| Arnica montana ø | Leopard's bane | Trauma, bruising, muscle soreness, sprains, pre/post-operative healing, mechanical injuries, shock - most widely used first-aid tincture |
| Rhus toxicodendron ø | Poison ivy | Rheumatism worse on first motion better by movement, joint stiffness, ligament injuries, chickenpox, skin eruptions |
| Ruta graveolens ø | Rue | Periosteum injuries, tendon strain, carpal tunnel, eye strain, sprains where Arnica has failed, ganglia |
| Symphytum officinale ø | Comfrey (Knitbone) | Fractures (accelerates bone healing), periosteal injuries, eye trauma, bony swellings |
| Ledum palustre ø | Wild rosemary | Puncture wounds, insect stings, gout (ascending from feet), cold extremities better cold applications |
| Bryonia alba ø | Wild hops | Arthritis worse even slightest motion, stitching pain, dry synovial membranes, pleuritis |
| Cimicifuga racemosa ø | Black cohosh | Rheumatism of muscles, ovarian neuralgia, headache, menopausal complaints, uterine complaints |
| Bellis perennis ø | Daisy | Deep tissue injuries (deeper than Arnica), muscle soreness of abdominal wall, sprains with swelling, postpartum soreness |
| Colchicum autumnale ø | Meadow saffron | Gout, acute arthritis, severe joint pain worse touch, pericarditis, nausea from smell of food |
| Guaiacum officinale ø | Lignum vitae | Gout, rheumatism, tonsillitis, syphilitic rheumatism, immovable contracted joints |
| Harpagophytum ø | Devil's claw | Arthritis, lower back pain, tendon/ligament problems, anti-inflammatory (growing use in Indian homoeopathy) |
| Mother Tincture | Source | Primary Applications |
|---|---|---|
| Calendula officinalis ø | Marigold | Wounds, burns, ulcers, skin healing, antiseptic (topical and internal), mastitis |
| Berberis aquifolium ø | Oregon grape | Acne, eczema, psoriasis, skin eruptions, liver-skin connection disorders, blood purifier |
| Echinacea ø | Purple coneflower | Boils, carbuncles, blood purifier, septic skin conditions |
| Thuja occidentalis ø | Arbor vitae | Warts, condylomata acuminata, polyps, oily skin, vaccinosis eruptions |
| Graphites ø | Carbon-based | Eczema with honey-like discharge, cracks at skin folds, keloids, thick skin eruptions |
| Sulphur ø | Sulphur | Itching skin eruptions worse heat and bathing, psoriasis, chronic eczema, acne, skin suppression |
| Hydrocotyle asiatica ø | Indian pennywort | Lupus, psoriasis, leprosy, skin indurations, ulcers, scleroderma, promotes skin granulation |
| Viola tricolor ø | Heartsease | Eczema in children, milk crust, scaly eruptions, urinary complaints accompanying skin disease |
| Cantharis ø | Spanish fly | Burns (topical), blisters, scalding sensations, sunburn, cystitis |
| Mother Tincture | Source | Primary Applications |
|---|---|---|
| Caulophyllum thalictroides ø | Blue cohosh | Uterine inertia during labor, dysmenorrhea, rigid os, habitual abortion, rheumatism in small joints |
| Cimicifuga racemosa ø | Black cohosh | Dysmenorrhea, menopause, ovarian pain, hysteria, rheumatic conditions linked to menstrual irregularities |
| Hamamelis virginiana ø | Witch hazel | Varicose veins, hemorrhoids, menorrhagia, passive venous hemorrhages, bruised sore feeling in veins |
| Sepia officinalis ø | Cuttlefish ink | Prolapse uterus, bearing-down sensation, leucorrhea, irregular menses, menopausal symptoms |
| Senecio aureus ø | Golden groundsel | Suppressed menses, vicarious menstruation, renal irritation, amenorrhea in young girls |
| Helonias dioica ø | False unicorn root | Uterine prolapse, chronic uterine weakness, leucorrhea, cervical erosion, diabetes, exhaustion |
| Mitchella repens ø | Partridgeberry | Dysuria during pregnancy, dysmenorrhea, difficult labor, ovarian and uterine neuralgia |
| Aletris farinosa ø | Star grass | Uterine atony, prolapse, repeated abortion, muscular weakness, extreme fatigue, anemia |
| Pulsatilla pratensis ø | Windflower | Irregular menses, menopausal flushes, thick bland discharges, mental weepiness, hormonal fluctuations |
| Viburnum opulus ø | Cramp bark | Dysmenorrhea with severe cramping, threatened abortion, spasmodic uterine pain, ovarian neuralgia |
| Mother Tincture | Source | Primary Applications |
|---|---|---|
| Sabal serrulata ø | Saw palmetto | Benign prostatic hyperplasia (BPH), urinary hesitancy, nocturia, sexual debility, atrophy of testes |
| Damiana ø (Turnera aphrodisiaca) | Damiana herb | Sexual debility, impotence, premature ejaculation, sexual neurasthenia, mental depression from sexual weakness |
| Agnus castus ø | Chaste tree | Sexual debility, premature senility, loss of libido (especially after gonorrhea), prostatic weakness |
| Yohimbinum ø | Yohimbe bark | Sexual neurasthenia, impotence, nervous exhaustion with sexual weakness |
| Staphisagria ø | Stavesacre | After surgical injuries (especially urogenital), sexual excess, grief with indignation, cystitis after catheterization |
| Mother Tincture | Source | Primary Applications |
|---|---|---|
| Calcarea fluorica ø | Calcium fluoride | Bone density, dental enamel weakness, hard fibrous tissue swellings, tendency to caries, hardening of lymph nodes |
| Calcarea phosphorica ø | Calcium phosphate | Delayed dentition, non-union of fractures, growing pains, anemia, debility in children, school headache |
| Alfalfa ø (Medicago sativa) | Lucerne/alfalfa | Nutritive tonic, weight gain, convalescence, poor appetite, anemia, increases appetite and body weight |
| China officinalis ø | Peruvian bark (Cinchona) | Debility from fluid loss, anemia, flatulence, periodic fevers, malaria, weakness after hemorrhage or diarrhea |
| Mother Tincture | Source | Primary Applications |
|---|---|---|
| Hamamelis virginiana ø | Witch hazel | Varicose veins, venous stasis, hemorrhoids, passive hemorrhages, passive congestion |
| Millefolium ø (Achillea) | Yarrow | Bleeding of all kinds (hemoptysis, hematuria, epistaxis), varicose veins, wounds with bleeding |
| Phosphorus ø | Phosphorus | Hemorrhages (bright red), hepatitis, pneumonia, fatty degeneration, tall thin constitutions |
| Ferrum metallicum ø | Iron | Anemia, menorrhagia, hemorrhages, weakness, pallor with flushing, vascular irritability |
| Trillium pendulum ø | Beth root | Profuse hemorrhages (uterine, renal), varicose conditions, fibroid-associated bleeding |
| Mother Tincture | Source | Primary Applications |
|---|---|---|
| Kali bichromicum ø | Potassium bichromate | Thick ropy stringy yellow-green discharges, sinusitis, chronic rhinitis, ozena, ulcers with punched-out edges |
| Hydrastis canadensis ø | Goldenseal | Thick yellow catarrhal discharges from any mucous membrane, sinusitis, catarrhal deafness |
| Agraphis nutans ø | Bluebell | Adenoids, enlarged tonsils, deafness from mucous accumulation, recurrent tonsillitis in children |
| Psorinum ø (nosode) | Scabies vesicle | Chronic skin conditions, offensive discharges, poverty of reaction, extreme chilliness, lack of vital heat |
| Euphrasia officinalis ø | Eyebright | Conjunctivitis, allergic eyes, profuse acrid eye discharge, photophobia, catarrhal ophthalmia, hay fever eyes |
| Cineraria maritima ø | Dusty miller | Cataract (early stages), opacity of cornea - topical eye drops in homoeopathy |
| Sanguinaria canadensis ø | Bloodroot | Right-sided headache (migraine), sinusitis, menopausal flushes, polyps of nose, chronic rhinitis |
| Mother Tincture | Source | Primary Applications |
|---|---|---|
| China officinalis ø | Cinchona bark | Malaria, periodic fevers, debility after fluid loss, flatulence, anemia, quinine source |
| Eucalyptus globulus ø | Blue gum tree | Malaria intermittens, bronchitis, urinary antiseptic, typhoid fever, anti-parasitic |
| Abrotanum ø | Southernwood | Marasmus (child wasting), metastasis of disease, rheumatism following suppressed discharge, emaciation in children |
| Spigelia anthelmia ø | Pinkroot | Worm infestation, left-sided headache/neuralgia, cardiac neurosis with palpitation, heart pain |
| Chenopodium anthelminticum ø | Wormseed | Intestinal worms, hookworm, ascariasis, buzzing tinnitus, hepatic enlargement |
| Condition | First-Line Mother Tincture(s) |
|---|---|
| Diabetes mellitus | Syzygium jambolanum ø, Gymnema sylvestre ø, Abroma augusta ø |
| Hypertension | Rauwolfia serpentina ø, Crataegus ø |
| Cardiac weakness | Crataegus ø, Terminalia arjuna ø, Cactus ø |
| Liver disorders | Chelidonium ø, Cardus marianus ø, Berberis vulgaris ø |
| Asthma/Bronchitis | Justicia adhatoda ø, Blatta orientalis ø, Grindelia ø |
| Urinary calculi | Berberis vulgaris ø, Hydrangea ø, Pareira brava ø |
| Trauma/bruises | Arnica montana ø, Calendula ø, Hypericum ø |
| BPH | Sabal serrulata ø, Hydrangea ø |
| Warts | Thuja ø |
| Varicose veins | Hamamelis ø |
| Anxiety/insomnia | Passiflora ø, Avena sativa ø, Valeriana ø |
| Nerve tonic | Avena sativa ø |
| Dysmenorrhea | Viburnum opulus ø, Cimicifuga ø |
| Anemia | Alfalfa ø, China ø, Ferrum ø |
| Children's adenoids | Agraphis nutans ø |
| Conjunctivitis | Euphrasia ø |
Note: Homoeopathic mother tinctures are used according to the principle of individualization in classical homoeopathy. The applications listed above reflect traditional homoeopathic materia medica (primarily Boericke's Pocket Manual of Materia Medica and Clarke's Dictionary of Practical Materia Medica) and should not be equated with evidence-based pharmaceutical claims. Seek a qualified practitioner for individualized prescribing.
Create a printable PDF guide of mother tinctures with dosing tables
mkdir -p /home/daytona/workspace/homoeopathy-pdf && python3 -c "from reportlab.platypus import SimpleDocTemplate; from reportlab.lib.pagesizes import A4; print('ready')"
~/homoeopathy-pdf/generate_mt_guide.py
#!/usr/bin/env python3
"""
Homoeopathic Mother Tinctures — Printable PDF Guide with Dosing Tables
Based on Boericke's Materia Medica, Clarke's Dictionary & Homoeopathic Pharmacopoeia of India (HPI)
"""
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import cm, mm
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_RIGHT, TA_JUSTIFY
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, KeepTogether, PageBreak, NextPageTemplate,
BaseDocTemplate, Frame, PageTemplate
)
from reportlab.lib.colors import HexColor
from reportlab.platypus.flowables import Flowable
OUTPUT = "/home/daytona/workspace/homoeopathy-pdf/Homoeopathic_Mother_Tinctures_Guide.pdf"
W, H = A4
LM = 1.8*cm
RM = 1.8*cm
TM = 1.8*cm
BM = 1.8*cm
BODY_W = W - LM - RM
# ── Colour palette ──────────────────────────────────────────────────────────
HERB_GREEN = HexColor("#2D6A4F")
LEAF_GREEN = HexColor("#40916C")
PALE_GREEN = HexColor("#D8F3DC")
MINT = HexColor("#B7E4C7")
DARK_NAVY = HexColor("#1B2A4A")
GOLD = HexColor("#D4A017")
PALE_GOLD = HexColor("#FFF8E1")
PALE_BLUE = HexColor("#E8F4FD")
TEAL = HexColor("#0E7C7B")
PALE_TEAL = HexColor("#E0F4F4")
BURGUNDY = HexColor("#7B2D8B")
PALE_PURPLE = HexColor("#F3E5F5")
ROSE = HexColor("#C62828")
PALE_ROSE = HexColor("#FFEBEE")
ORANGE = HexColor("#E65100")
PALE_ORANGE = HexColor("#FFF3E0")
SLATE = HexColor("#37474F")
LIGHT_GREY = HexColor("#F5F5F5")
MID_GREY = HexColor("#B0BEC5")
WHITE = colors.white
BLACK = colors.black
# Section colours (one per chapter)
SEC_COLORS = {
"immune": (HexColor("#1B5E20"), HexColor("#E8F5E9")),
"cardio": (HexColor("#B71C1C"), HexColor("#FFEBEE")),
"liver": (HexColor("#E65100"), HexColor("#FFF3E0")),
"kidney": (HexColor("#0D47A1"), HexColor("#E3F2FD")),
"resp": (HexColor("#4A148C"), HexColor("#F3E5F5")),
"neuro": (HexColor("#006064"), HexColor("#E0F7FA")),
"endo": (HexColor("#F57F17"), HexColor("#FFFDE7")),
"msk": (HexColor("#3E2723"), HexColor("#EFEBE9")),
"skin": (HexColor("#880E4F"), HexColor("#FCE4EC")),
"women": (HexColor("#AD1457"), HexColor("#FCE4EC")),
"men": (HexColor("#1565C0"), HexColor("#E3F2FD")),
"paeds": (HexColor("#558B2F"), HexColor("#F1F8E9")),
"blood": (HexColor("#C62828"), HexColor("#FFEBEE")),
"ent": (HexColor("#00695C"), HexColor("#E0F2F1")),
"fever": (HexColor("#4E342E"), HexColor("#EFEBE9")),
}
# ── Styles ───────────────────────────────────────────────────────────────────
def S(name, **kw):
s = ParagraphStyle(name, **kw)
return s
base = S('base', fontName='Helvetica', fontSize=8, leading=11,
textColor=BLACK, alignment=TA_LEFT)
body = S('body', parent=base, fontSize=8, leading=11, spaceAfter=2)
bodyj = S('bodyj', parent=base, fontSize=8, leading=11, alignment=TA_JUSTIFY, spaceAfter=2)
small = S('small', parent=base, fontSize=7, leading=9, textColor=SLATE)
note = S('note', parent=base, fontSize=7, leading=9, textColor=SLATE,
fontName='Helvetica-Oblique', spaceAfter=3)
th_s = S('th', parent=base, fontSize=7.5, fontName='Helvetica-Bold',
textColor=WHITE, alignment=TA_CENTER)
td_s = S('td', parent=base, fontSize=7.5, leading=10)
tdc_s = S('tdc', parent=base, fontSize=7.5, leading=10, alignment=TA_CENTER)
tdb_s = S('tdb', parent=base, fontSize=7.5, leading=10,
fontName='Helvetica-Bold')
drug_s= S('drug', parent=base, fontSize=8, fontName='Helvetica-Bold',
textColor=DARK_NAVY)
sec_s = S('sec', parent=base, fontSize=10, fontName='Helvetica-Bold',
textColor=WHITE, alignment=TA_LEFT)
chap_s= S('chap', parent=base, fontSize=16, fontName='Helvetica-Bold',
textColor=WHITE, alignment=TA_CENTER)
def p(txt, st=body): return Paragraph(txt, st)
def th(txt): return Paragraph(txt, th_s)
def td(txt): return Paragraph(txt, td_s)
def tdc(txt): return Paragraph(txt, tdc_s)
def tdb(txt): return Paragraph(txt, tdb_s)
# ── Helpers ──────────────────────────────────────────────────────────────────
def hr(color=LEAF_GREEN, thickness=0.5):
return HRFlowable(width="100%", thickness=thickness, color=color,
spaceAfter=3, spaceBefore=3)
def section_banner(text, fg=HERB_GREEN, icon=""):
label = f"{icon} {text}" if icon else text
data = [[Paragraph(label, sec_s)]]
t = Table(data, colWidths=[BODY_W])
t.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), fg),
('LEFTPADDING', (0,0), (-1,-1), 10),
('RIGHTPADDING', (0,0), (-1,-1), 10),
('TOPPADDING', (0,0), (-1,-1), 5),
('BOTTOMPADDING', (0,0), (-1,-1), 5),
]))
return t
def chapter_banner(text, fg=HERB_GREEN, sub=""):
rows = [[Paragraph(text, chap_s)]]
if sub:
sub_s = S('chsub', parent=base, fontSize=9, textColor=HexColor("#A5D6A7"),
alignment=TA_CENTER, fontName='Helvetica-Oblique')
rows.append([Paragraph(sub, sub_s)])
t = Table(rows, colWidths=[BODY_W])
t.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), fg),
('LEFTPADDING', (0,0), (-1,-1), 14),
('RIGHTPADDING', (0,0), (-1,-1), 14),
('TOPPADDING', (0,0), (-1,-1), 10),
('BOTTOMPADDING', (0,0), (-1,-1), 10),
]))
return t
def basic_table(headers, rows, col_widths, row_bg1=PALE_GREEN, row_bg2=WHITE,
hdr_color=HERB_GREEN):
data = [headers] + rows
t = Table(data, colWidths=col_widths, hAlign='LEFT')
cmds = [
('BACKGROUND', (0,0), (-1,0), hdr_color),
('ROWBACKGROUNDS',(0,1), (-1,-1), [row_bg1, row_bg2]),
('GRID', (0,0), (-1,-1), 0.35, MID_GREY),
('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
('TOPPADDING', (0,0), (-1,-1), 3),
('BOTTOMPADDING', (0,0), (-1,-1), 3),
('LEFTPADDING', (0,0), (-1,-1), 5),
('RIGHTPADDING', (0,0), (-1,-1), 5),
]
t.setStyle(TableStyle(cmds))
return t
# ══════════════════════════════════════════════════════════════════════════════
# DATA — Mother Tinctures
# Each entry: (latin_name, common_name, source, key_indications, dose, freq,
# cautions, special_use)
# ══════════════════════════════════════════════════════════════════════════════
GROUPS = [
# ── 1. Immune & Anti-Infective ────────────────────────────────────────────────
{
"title": "1. IMMUNE SYSTEM & ANTI-INFECTIVE",
"icon": "", "key": "immune",
"intro": ("Tinctures in this group modulate the immune response, combat septic and infective "
"conditions, and act as general blood purifiers. Many are used as supportive "
"drainage remedies."),
"drugs": [
("Echinacea angustifolia ø", "Purple Coneflower",
"Plant — Asteraceae",
"Recurrent infections, septicemia, lymphadenopathy, boils, carbuncles, blood purification, "
"immune deficiency states, snake/insect bites",
"10–15 drops", "3× daily", "Avoid continuous use >8 wks; may cause GI upset",
"Most widely used immune tincture; dilute in water"),
("Thuja occidentalis ø", "Arbor Vitae / White Cedar",
"Plant — Cupressaceae",
"Warts, condylomata acuminata, polyps, sinusitis, vaccinosis, oily skin, chronic catarrh, "
"immune dysregulation, post-vaccination complaints",
"10 drops", "3× daily", "Avoid in pregnancy (oxytocic); avoid topically on mucosa",
"Classic anti-sycotic remedy; also applied topically on warts"),
("Baptisia tinctoria ø", "Wild Indigo",
"Plant — Fabaceae",
"Septic high fevers, typhoid-like states, profound exhaustion, putrid/foul discharges, "
"bed-sores, gangrenous states, malignant tonsillitis",
"5–10 drops", "3× daily", "High doses may cause emesis; GI irritant in excess",
"Flag remedy for septic conditions with extreme exhaustion"),
("Calendula officinalis ø", "Marigold",
"Plant — Asteraceae",
"Wounds, cuts, ulcers, burns, surgical healing, mastitis, external hemorrhage, "
"suppurating wounds, raw surfaces",
"10 drops internal;\n1:10 in water topical", "3× daily", "Allergy to Asteraceae (rare)",
"Homoeopathic antiseptic — dilute 1:10 for wound dressings"),
("Phytolacca decandra ø", "Pokeweed",
"Plant — Phytolaccaceae",
"Tonsillitis (dark red throat), glandular swellings, mastitis, rheumatism of fibrous tissues, "
"syphilitic complaints, mumps, parotitis",
"5 drops", "3× daily", "Toxic in large doses; use at recommended dilution only",
"Tonsillitis with dark red throat and shooting pains into ears"),
("Ocimum sanctum ø", "Holy Basil / Tulsi",
"Plant — Lamiaceae",
"Recurrent respiratory infections, fever, viral conditions, antibacterial/antiviral support, "
"immune stimulant, cough, bronchitis",
"10–15 drops", "3× daily", "Generally safe; rare photosensitivity",
"Widely used in Indian homoeopathy; synergistic with Justicia ø for bronchitis"),
("Pyrogenium ø", "Decomposed Beef Nosode",
"Nosode — animal origin",
"Septicemia, puerperal fever, post-surgical sepsis, foetid discharges, conditions "
"not responding to well-selected remedies, acute onset of septic state",
"5 drops", "3–4× daily (acute)", "Nosode — use with qualified supervision",
"Often bridges treatment before specific remedy acts; 30C potency also used"),
],
},
# ── 2. Cardiovascular ─────────────────────────────────────────────────────────
{
"title": "2. CARDIOVASCULAR & CARDIAC SUPPORT",
"icon": "", "key": "cardio",
"intro": ("These tinctures are used as cardiac tonics, anti-hypertensives, and vascular "
"support agents. Many have pharmacologically active glycosides and alkaloids."),
"drugs": [
("Crataegus oxyacantha ø", "Hawthorn Berry",
"Plant — Rosaceae",
"Cardiac weakness, hypertension, arteriosclerosis, cardiac failure, palpitations, "
"angina, rapid irregular pulse — 'heart tonic'; myocardial degeneration",
"10–15 drops", "3× daily", "Potentiates digitalis; monitor if on cardiac drugs",
"Most prescribed cardiac mother tincture; may be used long-term safely"),
("Digitalis purpurea ø", "Foxglove",
"Plant — Plantaginaceae",
"Cardiac failure, atrial fibrillation, slow/irregular pulse, valvular insufficiency, "
"mitral stenosis, dropsy from cardiac origin, liver congestion from heart failure",
"1–5 drops", "2–3× daily", "NARROW THERAPEUTIC INDEX — never exceed dose; "
"toxicity risk: nausea, bradycardia, visual disturbance",
"Use under strict supervision; avoid concurrent digoxin therapy"),
("Cactus grandiflorus ø", "Night-Blooming Cereus",
"Plant — Cactaceae",
"Angina pectoris with constriction (iron-band sensation), endocarditis, mitral stenosis, "
"cardiac neurosis, violent palpitations, haemoptysis from cardiac cause",
"5–10 drops", "3× daily", "May cause headache; avoid in bradycardia",
"Constriction/iron-band sensation across chest — hallmark indication"),
("Terminalia arjuna ø", "Arjuna Tree",
"Plant — Combretaceae",
"Angina pectoris, cardiac insufficiency, arteriosclerosis, hypertension, fatty liver, "
"myocardial protection; gonorrhea; coronary artery disease",
"10–15 drops", "3× daily", "Generally safe; may lower BP in large doses",
"Popular in Indian homoeopathy and Ayurveda; antioxidant cardioprotective"),
("Rauwolfia serpentina ø", "Serpentwood / Sarpagandha",
"Plant — Apocynaceae",
"Hypertension, tachycardia, nervous agitation with raised BP, insomnia from hypertension, "
"anxiety-driven BP rise",
"10 drops", "2–3× daily", "May cause depression, nasal stuffiness; avoid in "
"depression or pregnancy; contains reserpine",
"Alkaloid reserpine present — monotherapy for mild hypertension in India"),
("Convallaria majalis ø", "Lily of the Valley",
"Plant — Asparagaceae",
"Rapid heart action with dyspnoea, cardiac failure with oedema, tobacco heart, "
"palpitations, endocarditis, mitral regurgitation",
"5–10 drops", "3× daily", "Contains cardioactive glycosides; avoid overdose",
"Heart remedy for overly rapid, weak cardiac action"),
("Strophanthus hispidus ø", "Kombe Arrow Poison",
"Plant — Apocynaceae",
"Cardiac muscle weakness, arteriosclerotic hearts, dropsy, rapid weak pulse, "
"use as digitalis substitute in elderly fragile patients",
"3–5 drops", "2–3× daily", "Cardioactive glycosides present; narrow margin",
"Preferred over Digitalis in elderly with muscular weakness"),
("Adonis vernalis ø", "Pheasant's Eye",
"Plant — Ranunculaceae",
"Cardiac weakness after influenza/fevers, mitral valve disease, fatty heart, "
"cardiac oedema with renal congestion, rapid action on compensation failure",
"5 drops", "3× daily", "Cardiotonic glycosides; avoid in bradycardia",
"Useful post-infection cardiac weakness"),
],
},
# ── 3. Liver & Digestive ──────────────────────────────────────────────────────
{
"title": "3. LIVER, DIGESTIVE & HEPATIC",
"icon": "", "key": "liver",
"intro": ("Hepato-protective, cholagogue, and digestive tinctures. Many assist with "
"biliary drainage, portal circulation, and hepatic cell protection."),
"drugs": [
("Chelidonium majus ø", "Greater Celandine",
"Plant — Papaveraceae",
"Liver disorders, jaundice, hepatitis, gallstones, biliary colic, pain at right shoulder "
"blade, constipation with clay-coloured stools, portal congestion, right-sided complaints",
"5–10 drops", "3× daily", "GI irritant in large doses; hepatotoxic overdose possible",
"Right shoulder blade pain = keynote; most-used liver MT"),
("Cardus marianus ø", "Milk Thistle",
"Plant — Asteraceae",
"Liver cirrhosis, alcoholic liver disease, hepatitis, portal hypertension, varicose veins, "
"haemorrhoids, liver protection after toxins/drugs",
"10–15 drops", "3× daily", "Occasional laxative effect; safe long-term",
"Silymarin content — hepatoprotective; combine with Chelidonium for hepatitis"),
("Berberis vulgaris ø", "Barberry",
"Plant — Berberidaceae",
"Liver and kidney complaints simultaneously, gallstones, renal calculi, biliary colic, "
"renal colic, jaundice, portal congestion, lumbago",
"10 drops", "3× daily", "Avoid in pregnancy (uterine stimulant)",
"Radiating pains from kidneys/liver; dual hepato-renal remedy"),
("Taraxacum officinale ø", "Dandelion",
"Plant — Asteraceae",
"Liver congestion, bilious headaches, mapped tongue, constipation, flatulence, "
"bitter eructations, general liver tonic, mild diuretic",
"10–15 drops", "3× daily", "May cause allergic reaction in Asteraceae allergy",
"Mapped/geographic tongue is a keynote; gentle daily liver tonic"),
("Nux vomica ø", "Poison Nut",
"Plant — Loganiaceae",
"Dyspepsia, constipation, irritable bowel, liver disorders, haemorrhoids, effects of "
"alcohol/drugs/overindulgence, sedentary lifestyle complaints, morning nausea",
"5 drops", "3× daily", "Contains strychnine alkaloids — use at correct dilution; "
"avoid overdose",
"Chiefly for sedentary over-indulgent patients; irritable, ambitious type"),
("Hydrastis canadensis ø", "Goldenseal",
"Plant — Ranunculaceae",
"Thick ropy yellow/green catarrhal discharges, gastritis, chronic constipation, "
"uterine haemorrhage, cancer cachexia tendency, liver weakness",
"5–10 drops", "3× daily", "Avoid in pregnancy (oxytocic); not for prolonged use",
"Thick stringy yellow discharge from any mucous surface — keynote"),
("Aloe socotrina ø", "Aloe",
"Plant — Asphodelaceae",
"Colitis, chronic diarrhoea with urgency, portal congestion, haemorrhoids (grape-like), "
"flatulence, irritable bowel syndrome, sluggish liver",
"5 drops", "3× daily", "Stimulant laxative effect in large doses; avoid in pregnancy",
"Haemorrhoids protruding like bunch of grapes; uncertain stools"),
("Picrorhiza kurroa ø", "Katuki / Kutki",
"Plant — Plantaginaceae",
"Hepatitis, liver cirrhosis, jaundice, malaria, immune stimulant, fever, "
"antioxidant liver protection, anti-inflammatory",
"10 drops", "3× daily", "Generally safe; rare GI upset",
"Widely used in Indian homoeopathy and Ayurveda for liver conditions"),
("Chionanthus virginica ø", "Fringe Tree",
"Plant — Oleaceae",
"Liver enlargement, catarrhal jaundice, biliary calculi, portal obstruction, "
"diabetes with hepatic involvement, malaria with liver",
"10 drops", "3× daily", "Generally safe",
"Diabetes + jaundice combination; biliary/liver calculus remedy"),
("Myrica cerifera ø", "Bayberry",
"Plant — Myricaceae",
"Catarrhal jaundice, liver congestion, lethargy, coldness of extremities, "
"depression with jaundice, duodenal catarrh",
"10 drops", "3× daily", "GI irritant in excess",
"Jaundice with marked lethargy and cold extremities"),
],
},
# ── 4. Kidney & Urinary ───────────────────────────────────────────────────────
{
"title": "4. KIDNEY, URINARY TRACT & RENAL",
"icon": "", "key": "kidney",
"intro": ("These tinctures address renal calculi, UTIs, renal inflammation, "
"and urinary complaints. Many act as gentle diuretics."),
"drugs": [
("Cantharis vesicatoria ø", "Spanish Fly",
"Animal — Meloidae (blister beetle)",
"Cystitis, urethritis, nephritis, intense burning/scalding during urination, "
"constant urge, haematuria, burns/scalds topically",
"3–5 drops", "3× daily (in acute:\nevery 2 hrs)", "IRRITANT in large doses; "
"avoid topically undiluted; nephrotoxic overdose",
"Keynote: burning before/during/after urination; every-2-hour dosing in acute UTI"),
("Berberis vulgaris ø", "Barberry",
"Plant — Berberidaceae",
"Renal calculi, urinary colic, haematuria, urinary burning, UTI, lumbago with "
"renal pains radiating into thighs",
"10 drops", "3× daily", "Avoid in pregnancy",
"Radiating fan-like pains from kidney region — signature symptom"),
("Solidago virgaurea ø", "Goldenrod",
"Plant — Asteraceae",
"Chronic kidney disorders, dysuria, haematuria, renal calculi, dropsy with renal cause, "
"nephritis, difficult scanty urine with back pain",
"10 drops", "3× daily", "Avoid in Asteraceae allergy",
"Renal disease with generalised dropsy; supportive drainage remedy"),
("Uva ursi ø", "Bearberry",
"Plant — Ericaceae",
"Cystitis, urethritis, chronic UTI, burning on urination, blood in urine, "
"chronic nephritis, bladder calculi",
"10–15 drops", "3× daily", "Avoid in renal insufficiency in large doses; "
"discolours urine green/brown",
"Arbutin content — antiseptic effect in alkaline urine; "
"pair with urinary alkalinisers"),
("Pareira brava ø", "Velvet Leaf",
"Plant — Menispermaceae",
"Calculous affections of urinary tract, difficult urination in BPH/urethral stricture, "
"chronic cystitis, renal and vesical irritability, gonorrhea",
"5–10 drops", "3× daily", "Generally safe",
"Has to get on hands and knees to pass urine — keynote"),
("Hydrangea arborescens ø", "Wild Hydrangea",
"Plant — Hydrangeaceae",
"Urinary calculi, renal gravel, dysuria, burning after urination, "
"enlarged prostate with calculous deposits, white amorphous deposits in urine",
"10–15 drops", "3× daily", "Large doses may cause vertigo and GI upset",
"White sandy deposits in urine — hallmark; prostate + calculus combination"),
("Senecio aureus ø", "Golden Groundsel",
"Plant — Asteraceae",
"Urinary disorders with suppressed menses, vicarious menstruation, "
"dysmenorrhoea with renal involvement, haematuria, chronic renal irritation",
"5–10 drops", "3× daily", "Avoid in pregnancy; hepatotoxic alkaloids in large doses",
"Gynaecological + renal connection remedy"),
],
},
# ── 5. Respiratory ────────────────────────────────────────────────────────────
{
"title": "5. RESPIRATORY SYSTEM",
"icon": "", "key": "resp",
"intro": ("The most commonly prescribed group in Indian homoeopathic practice. "
"These tinctures address asthma, bronchitis, cough, and upper respiratory conditions."),
"drugs": [
("Justicia adhatoda ø", "Malabar Nut / Adulsa / Vasaka",
"Plant — Acanthaceae",
"Acute bronchitis, bronchial asthma, spasmodic cough with profuse catarrh, "
"influenza with respiratory involvement, whooping cough, bleeding from lungs",
"10–15 drops", "3–4× daily (acute:\nevery 2 hrs)", "Generally safe; high doses "
"may cause emesis",
"Most used respiratory MT in India; vasicine content — bronchodilatory"),
("Blatta orientalis ø", "Indian Cockroach",
"Animal — Blattodea",
"Bronchial asthma (especially when Arsenicum fails), emphysema, dyspnoea worse "
"damp weather, asthma in obese patients, asthma with bronchitis",
"10 drops", "3× daily", "Generally safe at recommended dose",
"Consider when Arsenicum or Ipecac fail in asthma; damp aggravation"),
("Grindelia robusta ø", "Gumplant",
"Plant — Asteraceae",
"Asthma with smothering sensation on lying, bronchitis, emphysema, post-tussive "
"vomiting, foamy mucus, alternating asthma and skin eruptions",
"10 drops", "3× daily", "Avoid in Asteraceae allergy",
"Wakes from sleep gasping; must sit up; alternates with skin conditions"),
("Ipecacuanha ø", "Ipecac Root",
"Plant — Rubiaceae",
"Asthma with constant nausea, whooping cough, bronchitis with rattling, haemoptysis "
"with nausea, persistent nausea with any complaint, emetic in poisoning",
"5 drops", "3× daily (every 15 min\nin acute cough)", "High doses cause emesis",
"Nausea that is not relieved by vomiting — hallmark; used in homoeopathic emetotherapy"),
("Lobelia inflata ø", "Indian Tobacco",
"Plant — Campanulaceae",
"Asthma with anxiety, tobacco addiction withdrawal, bronchitis, cardiac dyspnoea, "
"nausea with tobacco, empty sensation in epigastrium",
"3–5 drops", "3× daily", "Toxic in excess; causes vomiting, vertigo; narrow margin",
"Used in nicotine desensitisation therapy; respiratory allergy"),
("Drosera rotundifolia ø", "Sundew",
"Plant — Droseraceae",
"Whooping cough, spasmodic laryngitis, deep hollow barking cough, croup, "
"laryngo-tracheal irritation, cough worse after midnight",
"5 drops", "4× daily", "Generally safe at homeopathic doses",
"Deep hoarse barking cough holding chest with both hands — keynote"),
("Eucalyptus globulus ø", "Blue Gum",
"Plant — Myrtaceae",
"Bronchitis, chronic nasal catarrh, malaria/intermittent fevers, urinary antiseptic, "
"antiseptic respiratory conditions, typhoid fever",
"5–10 drops", "3× daily", "Undiluted inhalation may irritate airways",
"Both internal and steam inhalation uses; antiseptic throughout body"),
("Bryonia alba ø", "Wild Hops",
"Plant — Cucurbitaceae",
"Dry painful pleuritic cough worse any motion, pleuritis, pneumonia with stitching pain, "
"arthritis worse least movement, constipation with dry hard stools",
"5 drops", "3× daily", "Large doses toxic (bryonin); GI irritant",
"Worse any motion is the cardinal modality for all Bryonia complaints"),
("Senega ø", "Snakeroot",
"Plant — Polygalaceae",
"Bronchial catarrh in elderly, pneumonia late stage, emphysema, profuse ropy mucus, "
"vision disturbances from ocular muscle weakness",
"5–10 drops", "3× daily", "GI irritant in large doses; emetic",
"Elderly patients with profuse tenacious mucous and emphysema"),
],
},
# ── 6. Nervous System ─────────────────────────────────────────────────────────
{
"title": "6. NERVOUS SYSTEM & MENTAL HEALTH",
"icon": "", "key": "neuro",
"intro": ("Nervines, adaptogens, and sedative tinctures. Used for anxiety, insomnia, "
"neuralgia, nerve injuries, and withdrawal states."),
"drugs": [
("Avena sativa ø", "Oat Plant",
"Plant — Poaceae",
"Nervous exhaustion, neurasthenia, sexual debility, morphine/opium withdrawal, "
"insomnia, mental fatigue, poor concentration, exam stress",
"10–15 drops", "3× daily", "Generally safe; gluten allergy consider",
"The 'nerve tonic' of homoeopathy — safe, daily-use nutritive"),
("Passiflora incarnata ø", "Passionflower",
"Plant — Passifloraceae",
"Insomnia (sleeplessness without pain), restlessness, whooping cough spasms, "
"tetanus, convulsions in children, nervous irritability",
"10–30 drops", "At bedtime\n(or 3× daily)", "Generally safe; rare GI upset",
"Best homoeopathic sleeping aid; combine with Avena for stress + insomnia"),
("Valeriana officinalis ø", "Valerian",
"Plant — Caprifoliaceae",
"Nervous irritability, hysteria, insomnia with restlessness, palpitations from nerves, "
"sciatica with restlessness, changeable symptoms, oversensitivity to pain",
"10 drops", "3× daily", "May interact with sedatives; avoid driving after large dose",
"Restlessness better from motion — differentiates from Arsenicum"),
("Hypericum perforatum ø", "St. John's Wort",
"Plant — Hypericaceae",
"Nerve injuries, lacerated wounds in nerve-rich areas (fingers, toes, spine), "
"coccyx injury, neuralgia after injury, tingling/burning from trauma, spinal concussion",
"10 drops internal;\n1:5 dilution topical", "3× daily", "Photosensitivity with "
"sun exposure; drug interactions (antidepressants, contraceptives)",
"Injuries to nerve-rich parts — fingertips, toes, coccyx, spine"),
("Gelsemium sempervirens ø", "Yellow Jasmine",
"Plant — Loganiaceae",
"Anticipatory anxiety, stage fright, nervous trembling, influenza with prostration, "
"vertigo, diplopia, occipital headache, diarrhoea from fright",
"5 drops", "3× daily", "Toxic in excess (gelsemicine); paralytic effects",
"Anticipation + trembling + weakness — pre-exam, pre-performance dosing"),
("Coffea cruda ø", "Unroasted Coffee",
"Plant — Rubiaceae",
"Oversensitivity to all stimuli, sleeplessness from joyful excitement/good news, "
"hyperalgesia, toothache relieved by cold water, palpitations from sudden joy",
"5 drops", "As needed", "Caffeine content at tincture strength — limit night use",
"Insomnia from pleasant excitement; opposite to emotional grief insomnia"),
("Kali bromatum ø", "Potassium Bromide",
"Mineral",
"Epilepsy, mania, acne from sexual excess, night terrors in children, "
"fidgety hands, sexual excess or suppression, sleeplessness",
"5 drops", "2–3× daily", "Bromism risk in large doses: acne, mental depression; "
"use at recommended dose only",
"Hands always busy/fidgety — characteristic; acne from sexual excess"),
],
},
# ── 7. Endocrine & Metabolic ──────────────────────────────────────────────────
{
"title": "7. ENDOCRINE & METABOLIC",
"icon": "", "key": "endo",
"intro": ("Important group in Indian homoeopathy for diabetes mellitus, thyroid disorders, "
"obesity, and metabolic syndrome."),
"drugs": [
("Syzygium jambolanum ø", "Java Plum / Jamun",
"Plant — Myrtaceae",
"Diabetes mellitus (reduces glycosuria and polyuria), prickly heat, diabetic ulcers, "
"thirst, great debility in diabetes",
"10–15 drops", "3× daily", "Monitor blood glucose; may enhance hypoglycaemic drugs",
"Most prescribed MT for diabetes in India; check FBS/PPBS regularly"),
("Gymnema sylvestre ø", "Gurmar / Sugar Destroyer",
"Plant — Apocynaceae",
"Diabetes mellitus, reduces sugar craving, blood glucose regulation, obesity, "
"metabolic syndrome, suppresses taste for sweets",
"10 drops", "3× daily", "Monitor blood glucose; hypoglycaemia risk with insulin",
"Suppresses sweet taste — useful in diet compliance for diabetics"),
("Abroma augusta ø", "Ulat Kambal",
"Plant — Malvaceae",
"Diabetes with weakness, glycosuria, diabetic nephropathy, dysmenorrhoea, "
"uterine disorders with diabetes, emaciation in diabetes",
"10 drops", "3× daily", "Avoid in pregnancy; uterine stimulant",
"Diabetes + gynaecological complaint combination — Indian clinical experience"),
("Momordica charantia ø", "Bitter Gourd / Karela",
"Plant — Cucurbitaceae",
"Diabetes mellitus, hypoglycaemic support, liver conditions, antiparasitic, "
"fever, helminths",
"10 drops", "3× daily", "Avoid in pregnancy; hypoglycaemia risk",
"Vegetable source; commonly combined with Syzygium in Indian practice"),
("Thyroidinum ø", "Thyroid Gland",
"Sarcode — animal origin",
"Hypothyroidism, myxoedema, cretinism, goitre, obesity from thyroid, "
"delayed puberty, skin disorders from thyroid",
"5–10 drops", "2× daily", "Monitor TFTs; may aggravate hyperthyroidism",
"Sarcode — use under supervision; adjunct to thyroxine therapy"),
("Chionanthus virginica ø", "Fringe Tree",
"Plant — Oleaceae",
"Diabetes with glycosuria, biliary obstruction, liver enlargement, jaundice, "
"malaria with hepatic involvement",
"10 drops", "3× daily", "Generally safe",
"Diabetes + liver/biliary pathology — combined organ remedy"),
],
},
# ── 8. Musculoskeletal ────────────────────────────────────────────────────────
{
"title": "8. MUSCULOSKELETAL & JOINT",
"icon": "", "key": "msk",
"intro": ("Trauma remedies, anti-rheumatics, and bone/ligament tinctures. "
"Several are used topically in first-aid."),
"drugs": [
("Arnica montana ø", "Leopard's Bane",
"Plant — Asteraceae",
"Trauma, bruising, sprains, muscle soreness, mechanical injuries, shock from injury, "
"pre/post-operative healing, sports injuries, overexertion",
"10 drops internal;\n1:10 topical lotion", "Every 2 hrs\n(acute); 3× (sub-acute)",
"Never apply topically to broken skin; may cause contact dermatitis",
"Most widely used first-aid MT; dilute lotion never on open wounds"),
("Rhus toxicodendron ø", "Poison Ivy",
"Plant — Anacardiaceae",
"Rheumatism worse first motion, better continued movement; joint stiffness, "
"ligament injuries, chickenpox, herpetic eruptions, restlessness at night",
"5 drops", "3× daily", "Skin sensitivity on contact; dilute if applying externally",
"Worse first motion/rest, better continued movement — hallmark modality"),
("Ruta graveolens ø", "Rue",
"Plant — Rutaceae",
"Periosteum injuries, tendon strain, carpal tunnel, eye strain from close work, "
"sprains after Arnica, ganglia, bruised bone pain, rectal cancer affinity",
"5–10 drops", "3× daily", "Photosensitising; avoid sun after topical use; "
"avoid in pregnancy",
"Periosteum and tendon injuries — deeper tissue than Arnica"),
("Symphytum officinale ø", "Comfrey / Knitbone",
"Plant — Boraginaceae",
"Fractures (accelerates bone healing), periosteal injuries, blunt eye injuries, "
"bony tumours, irritable stump after amputation",
"10 drops", "3× daily", "Contains pyrrolizidine alkaloids — avoid internal use "
"long-term; external use safer",
"Fracture healing — 'knits bone'; blunt eye trauma"),
("Ledum palustre ø", "Wild Rosemary / Marsh Tea",
"Plant — Ericaceae",
"Puncture wounds, insect stings, gout (ascending from feet), cold extremities "
"better cold applications, black eye, rheumatism in small joints",
"5–10 drops", "3× daily", "Generally safe",
"Injuries better cold — opposite to Arnica; puncture/sting remedy"),
("Bellis perennis ø", "Common Daisy",
"Plant — Asteraceae",
"Deep tissue injuries (deeper than Arnica), muscle soreness of abdominal wall/uterus, "
"sprains with swelling, postpartum abdominal soreness, railway spine",
"10 drops", "3× daily", "Generally safe",
"Deeper bruising than Arnica; abdominal wall and uterine soreness"),
("Colchicum autumnale ø", "Meadow Saffron",
"Plant — Colchicaceae",
"Gout, acute arthritis with extreme pain worse touch, pericarditis, peritonitis, "
"nausea from smell of food, dropsical conditions",
"3–5 drops", "3× daily", "Toxic plant — colchicine content; avoid large doses; "
"narrow safety margin",
"Smell of cooking food causes nausea — hallmark; acute gout remedy"),
("Cimicifuga racemosa ø", "Black Cohosh / Bugbane",
"Plant — Ranunculaceae",
"Rheumatism of muscles and tendons, dysmenorrhoea, ovarian neuralgia, "
"menopausal complaints, uterine inertia, mental depression alternating with physical pain",
"5–10 drops", "3× daily", "Avoid in pregnancy (may stimulate uterus); "
"headache in large doses",
"Mental anguish alternates with physical pain — characteristic"),
],
},
# ── 9. Dermatology & Skin ─────────────────────────────────────────────────────
{
"title": "9. DERMATOLOGY & SKIN",
"icon": "", "key": "skin",
"intro": ("Used both topically and internally. Several have direct pharmacological "
"activity on skin pathogens or inflammatory pathways."),
"drugs": [
("Berberis aquifolium ø", "Oregon Grape",
"Plant — Berberidaceae",
"Acne vulgaris, eczema, psoriasis, skin eruptions with liver connection, "
"blood purifier, sallow/yellowish complexion, scaly eruptions",
"10 drops", "3× daily", "Generally safe; avoid in pregnancy",
"Liver-skin axis remedy — clears skin by draining hepatic congestion"),
("Hydrocotyle asiatica ø", "Indian Pennywort / Gotu Kola",
"Plant — Apiaceae",
"Lupus, psoriasis, leprosy, skin indurations, chronic ulcers, scleroderma, "
"promotes wound granulation, ichthyosis",
"10 drops", "3× daily", "Photosensitivity reported; monitor liver in long-term use",
"Asiaticoside content — promotes collagen synthesis; chronic skin induration"),
("Viola tricolor ø", "Heartsease / Wild Pansy",
"Plant — Violaceae",
"Eczema in children (milk crust), scaly crusty eruptions especially on scalp/face, "
"urinary complaints with skin disease, burning micturition with skin",
"5–10 drops", "3× daily", "Generally safe",
"Childhood eczema with urinary complaints — skin-urinary connection"),
("Thuja occidentalis ø", "Arbor Vitae",
"Plant — Cupressaceae",
"Warts, condylomata acuminata, polyps, post-vaccination skin complaints, "
"oily/unhealthy skin, fig warts, naevi",
"10 drops internal;\napply neat topically on warts",
"3× daily; topical\n2× daily", "Avoid in pregnancy; thujone toxicity in large doses",
"Both internal and topical application on warts is standard practice"),
("Cantharis ø", "Spanish Fly",
"Animal — Blattodea",
"Burns, scalds, blisters, sunburn (topical), bee/wasp stings, "
"erysipelas with vesicles, cystitis (internal — see kidney group)",
"1:20 topical for burns", "Apply 3–4× daily\nto affected area",
"NEVER apply undiluted topically; vesicant; nephrotoxic internally in excess",
"Topical burn dressing — dilute 20 drops in 200 mL cool water"),
("Calendula officinalis ø", "Marigold",
"Plant — Asteraceae",
"Open wounds, lacerations, burns, post-surgical wounds, ulcers, "
"raw/suppurating surfaces, mastitis, cervical erosion",
"Topical: 20 drops in\n200 mL boiled water;\nInternal: 10 drops",
"Dressings 2–3×\ndaily; internal 3×",
"Allergy to Asteraceae family (rare)",
"Primary first-aid wound antiseptic; 'Homoeopathic Savlon'"),
],
},
# ── 10. Women's Health ────────────────────────────────────────────────────────
{
"title": "10. WOMEN'S HEALTH & GYNAECOLOGICAL",
"icon": "", "key": "women",
"intro": ("Uterine tonics, emmenagogues, and hormonal support tinctures. Several have "
"potent uterine activity — caution in pregnancy."),
"drugs": [
("Caulophyllum thalictroides ø", "Blue Cohosh",
"Plant — Berberidaceae",
"Uterine inertia in labour, rigid os, habitual abortion, dysmenorrhoea, "
"small joint rheumatism (especially in women), leucorrhoea",
"5–10 drops", "3× daily (not in\nearly pregnancy)", "Powerful uterine stimulant; "
"AVOID in first trimester; use only near term under supervision",
"Intrapartum uterine inertia — classic obstetric homoeopathic indication"),
("Viburnum opulus ø", "Cramp Bark",
"Plant — Adoxaceae",
"Dysmenorrhoea with severe cramping, threatened abortion from spasmodic causes, "
"ovarian neuralgia, false labour pains, pelvic spasm",
"10–15 drops", "Every 2 hrs\n(acute cramps)", "Generally safe",
"Best MT for spasmodic dysmenorrhoea; combine with Magnesium phos"),
("Helonias dioica ø", "False Unicorn Root",
"Plant — Melanthiaceae",
"Uterine prolapse, chronic uterine weakness, leucorrhoea, cervical erosion, "
"diabetes with uterine complaints, profound fatigue, anaemia in women",
"5–10 drops", "3× daily", "Avoid in early pregnancy",
"Prolapse with diabetes in debilitated women — combination remedy"),
("Aletris farinosa ø", "Star Grass / Unicorn Root",
"Plant — Nartheciaceae",
"Uterine atony/prolapse, repeated spontaneous abortion, extreme muscular weakness, "
"anaemia in young women, bitter taste, anorexia",
"5 drops", "3× daily", "Avoid in early pregnancy",
"Weakness and heaviness of whole body — characteristic; anaemia in women"),
("Senecio aureus ø", "Golden Groundsel",
"Plant — Asteraceae",
"Suppressed menses in young girls, vicarious menstruation, "
"dysmenorrhoea with renal irritation, anaemia with menstrual disorder",
"5–10 drops", "3× daily", "Hepatotoxic pyrrolizidine alkaloids — limit duration; "
"avoid in pregnancy",
"Amenorrhoea in young girls with haematuria — specific combination"),
("Hamamelis virginiana ø", "Witch Hazel",
"Plant — Hamamelidaceae",
"Menorrhagia, passive venous haemorrhage, varicose veins, haemorrhoids, "
"bruised sore feeling in veins, ovarian congestion, pelvic varices",
"10–15 drops internal;\ndilute 1:5 topical", "3× daily", "Generally safe",
"Venous and haemorrhagic conditions — passive non-coagulable bleeding"),
("Mitchella repens ø", "Partridgeberry",
"Plant — Rubiaceae",
"Dysuria during pregnancy, dysmenorrhoea, painful/difficult labour, "
"ovarian and uterine neuralgia, nursing sore nipples",
"5 drops", "3× daily", "Use cautiously in pregnancy",
"Pregnancy dysuria + sore nipples during nursing"),
],
},
# ── 11. Men's Health ──────────────────────────────────────────────────────────
{
"title": "11. MEN'S HEALTH & UROGENITAL",
"icon": "", "key": "men",
"intro": ("Tinctures addressing BPH, sexual debility, prostate, and male reproductive health."),
"drugs": [
("Sabal serrulata ø", "Saw Palmetto",
"Plant — Arecaceae",
"BPH (benign prostatic hyperplasia), urinary hesitancy/frequency/nocturia, "
"sexual debility, atrophy of testes, painful coition, breast and ovary affections",
"10–15 drops", "3× daily", "May interfere with hormone therapies; "
"monitor PSA levels",
"Most prescribed MT for BPH in India; may reduce PSA slightly"),
("Agnus castus ø", "Chaste Tree",
"Plant — Lamiaceae",
"Sexual debility, premature senility, loss of libido after gonorrhoea, "
"prostatic weakness, cold genitals, spermatorrhoea",
"5–10 drops", "3× daily", "May affect dopamine; caution with psychiatric drugs",
"Complete loss of sexual desire — especially after gonorrhoea/STI history"),
("Damiana ø", "Turnera aphrodisiaca",
"Plant — Passifloraceae",
"Sexual neurasthenia, impotence, premature ejaculation, mental depression "
"from sexual weakness, nervous exhaustion with sexual component",
"10–15 drops", "3× daily", "Generally safe; mild stimulant",
"Nerve tonic specific to sexual system; safe daily tonic"),
("Staphisagria ø", "Stavesacre",
"Plant — Ranunculaceae",
"Post-surgical injuries especially urogenital, cystitis after catheterisation, "
"sexual excess, grief with indignation, suppressed anger, 'sweetly polite' patients",
"5 drops", "3× daily", "Delphinine content — avoid overdose",
"Affronts and indignation — emotional suppression in polite patients"),
],
},
# ── 12. Paediatric & Nutritive ────────────────────────────────────────────────
{
"title": "12. PAEDIATRIC, NUTRITIVE & TONIC",
"icon": "", "key": "paeds",
"intro": ("Tonic, nutritive, and paediatric tinctures. Many are safe for "
"children when properly diluted."),
"drugs": [
("Alfalfa ø", "Lucerne / Medicago sativa",
"Plant — Fabaceae",
"Underweight, poor appetite, convalescence, anaemia, general debility, "
"increases weight and appetite, nutritive tonic, diuresis",
"10–15 drops", "3× daily before meals", "Generally safe; alfalfa allergy rare",
"The classic homoeopathic tonic; safe for all ages; palatable"),
("China officinalis ø", "Peruvian Bark / Cinchona",
"Plant — Rubiaceae",
"Debility after fluid loss (haemorrhage, diarrhoea, sweating), anaemia, "
"flatulence/bloating, periodic fevers/malaria, painless diarrhoea",
"5–10 drops", "3× daily", "Contains quinine alkaloids; avoid in G6PD deficiency; "
"tinnitus in large doses",
"Debility from fluid loss — haemorrhage, diarrhoea, nursing; periodic fever"),
("Abrotanum ø", "Southernwood / Lad's Love",
"Plant — Asteraceae",
"Marasmus in children (wasting with good appetite), metastasis of disease, "
"rheumatism after suppressed discharge, emaciation in lower limbs",
"5 drops", "3× daily", "Avoid in Asteraceae allergy",
"Child eats well but emaciates — paradox; marasmus keynote"),
("Calcarea phosphorica ø", "Calcium Phosphate",
"Mineral",
"Delayed dentition, non-union of fractures, growing pains in children, "
"anaemia, school headache, delayed milestones, thin debilitated children",
"10 drops", "3× daily", "Generally safe",
"Tissue salt with profound action on growth and bone development"),
("Ferrum metallicum ø", "Iron",
"Mineral",
"Anaemia, paleness alternating with flushing, menorrhagia, weakness, "
"vascular irritability, haemorrhages, young anaemic women",
"5–10 drops", "3× daily", "GI upset in large doses",
"Anaemia with flushing at any excitement — not typical pallor"),
],
},
# ── 13. Haematological & Venous ───────────────────────────────────────────────
{
"title": "13. HAEMATOLOGICAL & VENOUS",
"icon": "", "key": "blood",
"intro": ("Anti-haemorrhagic, venous tonic, and blood-building tinctures."),
"drugs": [
("Hamamelis virginiana ø", "Witch Hazel",
"Plant — Hamamelidaceae",
"Varicose veins, venous stasis, haemorrhoids, passive haemorrhage (non-coagulable), "
"menorrhagia, bruised sore veins, phlebitis, pelvic varices",
"10–15 drops internal;\ndilute topical compress", "3× daily", "Generally safe",
"Passive venous haemorrhages — dark non-coagulable blood; sore bruised veins"),
("Millefolium ø", "Yarrow / Achillea millefolium",
"Plant — Asteraceae",
"Active bleeding of all kinds — haemoptysis, haematuria, epistaxis, "
"metrorrhagia, varicose veins, wounds with bleeding",
"10 drops", "3–4× daily\n(every hr acute)", "Avoid in Asteraceae allergy; "
"blood-thinning effect",
"Bright red flowing haemorrhages; combine with Phosphorus for haemoptysis"),
("Trillium pendulum ø", "Beth Root",
"Plant — Melanthiaceae",
"Profuse uterine haemorrhage, renal haemorrhage, varicose conditions, "
"fibroids with bleeding, metrorrhagia, band sensation around pelvis",
"5–10 drops", "3–4× daily", "Generally safe at recommended dose",
"Band sensation around hips — characteristic of Trillium complaints"),
("Phosphorus ø", "Phosphorus",
"Mineral",
"Bright red haemorrhages from any organ, hepatitis, fatty degeneration, "
"pneumonia with rust-coloured sputum, tall thin constitutions, social anxiety",
"3–5 drops", "3× daily", "Toxic in large doses; must use highly diluted; "
"avoid in haemophilia without supervision",
"Vivid, bright red bleeding with no apparent cause; sympathetic social nature"),
],
},
# ── 14. ENT & Eye ─────────────────────────────────────────────────────────────
{
"title": "14. EAR, NOSE, THROAT & EYE",
"icon": "", "key": "ent",
"intro": ("Catarrhal, anti-inflammatory, and drainage tinctures for ENT "
"and ophthalmological conditions."),
"drugs": [
("Euphrasia officinalis ø", "Eyebright",
"Plant — Orobanchaceae",
"Allergic conjunctivitis, hay fever eyes, acrid profuse eye discharge, photophobia, "
"catarrhal ophthalmia, bland nasal discharge with acrid tears",
"5 drops internal;\n2 drops in eye wash\n(dilute 1:50)", "3× daily; eyewash\n2–3× daily",
"Dilute strictly for eye wash; contact lens wearers — remove lenses",
"Tears scald cheeks; nasal discharge bland — reverse of Allium cepa"),
("Agraphis nutans ø", "Bluebell",
"Plant — Asparagaceae",
"Enlarged adenoids in children, recurrent tonsillitis, deafness from mucous "
"accumulation, obstructed Eustachian tube, chronic catarrhal otitis media",
"5 drops", "3× daily", "Generally safe in children",
"Adenoids + deafness in children — most useful combination; no surgery first"),
("Cineraria maritima ø", "Dusty Miller",
"Plant — Asteraceae",
"Early cataract, corneal opacity, pterygium, traumatic corneal opacities",
"Topical eye drops:\n1–2 drops per eye", "3× daily in eye", "Commercial preparations "
"preferred; do not self-prepare; Asteraceae allergy",
"Commercially available cataract eye drops in homoeopathy; long-term use needed"),
("Sanguinaria canadensis ø", "Bloodroot",
"Plant — Papaveraceae",
"Right-sided migraine (ascending from occiput to right eye), sinusitis, "
"menopause flushes, polyps of nose, chronic rhinitis, chronic tonsillitis",
"5 drops", "3× daily", "GI irritant; emetic in large doses; avoid in pregnancy",
"Right-sided headache — burns like fire; menopause flush + headache combination"),
("Hydrastis canadensis ø", "Goldenseal",
"Plant — Ranunculaceae",
"Thick stringy yellow-green catarrhal discharges from sinuses/nose, "
"catarrhal deafness, ozaena, post-nasal drip, sinusitis",
"5 drops", "3× daily", "Avoid in pregnancy; not for prolonged use (berberine)",
"Ropy stringy discharge — sticks to surfaces; the classic sinusitis MT"),
("Kali bichromicum ø", "Potassium Bichromate",
"Mineral",
"Thick ropy string-like yellow-green discharges, sinusitis, chronic rhinitis, "
"ozaena, stomach ulcer with round punched-out edges, croup",
"3–5 drops", "3× daily", "Chromate toxicity in large doses; "
"keep away from children",
"Stringy/ropy discharge that can be drawn out in long strings — hallmark"),
],
},
# ── 15. Fever & Anti-Parasitic ────────────────────────────────────────────────
{
"title": "15. FEVER, ANTI-PARASITIC & ANTI-MALARIAL",
"icon": "", "key": "fever",
"intro": ("Tinctures traditionally used for malarial fevers, helminthic infestations, "
"and debility from infection."),
"drugs": [
("China officinalis ø", "Cinchona / Peruvian Bark",
"Plant — Rubiaceae",
"Malaria, periodic fevers, debility from fluid loss, painless diarrhoea, "
"anaemia, flatulence/distension, hepatomegaly from malaria",
"10 drops", "3× daily; hourly\nin acute fever", "Quinine content — avoid in G6PD "
"deficiency; tinnitus; arrhythmia at high dose",
"Periodic chill-heat-sweat cycle; debility from fluid loss is the hallmark"),
("Eucalyptus globulus ø", "Blue Gum",
"Plant — Myrtaceae",
"Intermittent fevers/malaria, bronchitis, antiseptic urinary conditions, "
"typhoid fever, septic conditions, nasopharyngeal antiseptic",
"5–10 drops", "3× daily", "Convulsions in children from 1,8-cineole; do not apply "
"near face/nose of infants",
"Broad antiseptic: respiratory + urinary + systemic; steam inhalation also used"),
("Spigelia anthelmia ø", "Pinkroot",
"Plant — Loganiaceae",
"Worm infestation, left-sided neuralgia/headache, cardiac palpitation with worms, "
"heart pain with anaemia from parasites, strabismus in children with worms",
"3–5 drops", "3× daily", "Toxic in excess; neurotoxic alkaloids",
"Child with round worms + heart palpitation + left-sided headache — combination"),
("Chenopodium anthelminticum ø", "Wormseed",
"Plant — Amaranthaceae",
"Intestinal worms (roundworm, hookworm, ascaris), buzzing tinnitus, "
"hepatic enlargement, auditory nerve affinity",
"3 drops", "3× daily", "Ascaridole content — toxic in large doses; narrow margin",
"Tinnitus with worm infestation — specific combination; anthelmintic"),
("Abrotanum ø", "Southernwood",
"Plant — Asteraceae",
"Marasmus, wasting with hunger, alternating rheumatism and diarrhoea, "
"metastasis/suppression of one complaint driving another condition",
"5 drops", "3× daily", "Avoid in Asteraceae allergy",
"Disease driven from one location to another — metastasis keynote"),
],
},
] # end GROUPS
# ══════════════════════════════════════════════════════════════════════════════
# BUILD PDF
# ══════════════════════════════════════════════════════════════════════════════
# Page numbering
class PageNumCanvas:
pass # We'll use onFirstPage/onLaterPages callbacks
page_num = [0]
def on_page(canvas, doc):
page_num[0] += 1
canvas.saveState()
# Footer bar
canvas.setFillColor(HERB_GREEN)
canvas.rect(LM, BM - 12, BODY_W, 12, fill=1, stroke=0)
canvas.setFillColor(WHITE)
canvas.setFont('Helvetica', 7)
canvas.drawString(LM + 4, BM - 9,
"Homoeopathic Mother Tinctures Guide | Based on Boericke's Materia Medica & HPI")
canvas.drawRightString(LM + BODY_W - 4, BM - 9, f"Page {page_num[0]}")
# Top micro-bar
canvas.setFillColor(GOLD)
canvas.rect(LM, H - TM + 2, BODY_W, 3, fill=1, stroke=0)
canvas.restoreState()
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
topMargin=TM + 4,
bottomMargin=BM + 14,
leftMargin=LM,
rightMargin=RM,
title="Homoeopathic Mother Tinctures — Complete Clinical Guide",
author="Boericke Materia Medica / HPI",
subject="Homoeopathy Mother Tinctures with Dosing Tables",
)
story = []
# ── COVER PAGE ────────────────────────────────────────────────────────────────
cover_rows = [
[Paragraph("HOMOEOPATHIC", S('c1', fontName='Helvetica', fontSize=20,
textColor=GOLD, alignment=TA_CENTER))],
[Paragraph("MOTHER TINCTURES", S('c2', fontName='Helvetica-Bold', fontSize=32,
textColor=WHITE, alignment=TA_CENTER))],
[Paragraph("Complete Clinical Guide with Dosing Tables", S('c3', fontName='Helvetica',
fontSize=13, textColor=MINT, alignment=TA_CENTER))],
[Spacer(1, 10)],
[Paragraph("15 Therapeutic Groups • 90+ Mother Tinctures • Indications, Doses & Cautions",
S('c4', fontName='Helvetica-Oblique', fontSize=9, textColor=HexColor("#A5D6A7"),
alignment=TA_CENTER))],
[Spacer(1, 6)],
[Paragraph("Based on: Boericke's Pocket Manual of Materia Medica | Clarke's Dictionary "
"of Practical Materia Medica\nHomoeopathic Pharmacopoeia of India (HPI)",
S('c5', fontName='Helvetica', fontSize=8, textColor=HexColor("#81C784"),
alignment=TA_CENTER))],
]
cover = Table(cover_rows, colWidths=[BODY_W])
cover.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), HERB_GREEN),
('TOPPADDING', (0,0), (-1,-1), 8),
('BOTTOMPADDING', (0,0), (-1,-1), 8),
('LEFTPADDING', (0,0), (-1,-1), 20),
('RIGHTPADDING', (0,0), (-1,-1), 20),
]))
story.append(cover)
story.append(Spacer(1, 8))
# ── INTRODUCTION BOX ──────────────────────────────────────────────────────────
intro_text = (
"<b>What is a Mother Tincture (ø / Q)?</b> A mother tincture is the starting homoeopathic "
"preparation — a hydroalcoholic extract of plant, animal, or mineral material (typically 1:10 "
"dilution in ethanol/water) prepared by maceration or percolation. It retains measurable "
"active constituents and forms the base from which all potentised dilutions are made. "
"Mother tinctures are used directly when organ-supportive, drainage, or more material "
"pharmacological action is required.<br/><br/>"
"<b>Standard Dosing Convention:</b> Unless otherwise stated, dilute the prescribed drops in "
"half a cup (100–150 mL) of plain water before administration. For children under 12, "
"halve the adult dose. Always individualize dosing under a qualified homoeopath's guidance."
)
intro_data = [[Paragraph(intro_text, bodyj)]]
intro_t = Table(intro_data, colWidths=[BODY_W])
intro_t.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), PALE_GOLD),
('BOX', (0,0), (-1,-1), 0.8, GOLD),
('LEFTPADDING', (0,0), (-1,-1), 10),
('RIGHTPADDING', (0,0), (-1,-1), 10),
('TOPPADDING', (0,0), (-1,-1), 8),
('BOTTOMPADDING', (0,0), (-1,-1), 8),
]))
story.append(intro_t)
story.append(Spacer(1, 10))
# ── TABLE OF CONTENTS ─────────────────────────────────────────────────────────
story.append(section_banner("CONTENTS", DARK_NAVY))
story.append(Spacer(1, 4))
toc_items = [(g["title"], str(i+1)) for i, g in enumerate(GROUPS)]
toc_items.append(("QUICK REFERENCE — Common Conditions & First-Line Tinctures", str(len(GROUPS)+1)))
toc_items.append(("GENERAL DOSING, PREPARATION & SAFETY NOTES", str(len(GROUPS)+1)))
toc_rows = []
for i, (title, pn) in enumerate(toc_items):
bg = PALE_GREEN if i % 2 == 0 else WHITE
toc_rows.append([td(title), tdc(pn)])
toc_t = Table([[th("Section"), th("Pg#")]] + toc_rows,
colWidths=[BODY_W - 1.5*cm, 1.5*cm])
toc_t.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,0), HERB_GREEN),
('ROWBACKGROUNDS',(0,1),(-1,-1),[PALE_GREEN, WHITE]),
('GRID', (0,0),(-1,-1), 0.3, MID_GREY),
('TOPPADDING', (0,0),(-1,-1), 3),
('BOTTOMPADDING', (0,0),(-1,-1), 3),
('LEFTPADDING', (0,0),(-1,-1), 6),
]))
story.append(toc_t)
story.append(Spacer(1, 4))
story.append(p("<i>Note: Page numbers are approximate and depend on printer settings.</i>", note))
story.append(PageBreak())
# ── MAIN GROUPS ───────────────────────────────────────────────────────────────
for grp in GROUPS:
key = grp["key"]
hcol, bgcol = SEC_COLORS.get(key, (HERB_GREEN, PALE_GREEN))
# Chapter banner
story.append(chapter_banner(grp["title"], fg=hcol))
story.append(Spacer(1, 4))
# Intro paragraph
intro_box = Table([[Paragraph(grp["intro"], bodyj)]], colWidths=[BODY_W])
intro_box.setStyle(TableStyle([
('BACKGROUND', (0,0),(-1,-1), bgcol),
('BOX', (0,0),(-1,-1), 0.5, hcol),
('LEFTPADDING', (0,0),(-1,-1), 8),
('RIGHTPADDING', (0,0),(-1,-1), 8),
('TOPPADDING', (0,0),(-1,-1), 5),
('BOTTOMPADDING', (0,0),(-1,-1), 5),
]))
story.append(intro_box)
story.append(Spacer(1, 6))
# Drug table
# Cols: Latin Name | Common/Source | Indications | Dose | Freq | Cautions
COL_W = [3.4*cm, 2.5*cm, 5.8*cm, 2.0*cm, 1.6*cm, 2.7*cm]
hdr_row = [th("Latin Name (ø)"), th("Common Name\nSource"),
th("Key Indications"), th("Dose"),
th("Frequency"), th("Cautions / Special Notes")]
data_rows = []
for i, drug in enumerate(grp["drugs"]):
(latin, common, src, inds, dose, freq, cauts, special) = drug
row_bg = bgcol if i % 2 == 0 else WHITE
data_rows.append([
Paragraph(f"<b>{latin}</b>", tdb_s),
Paragraph(f"{common}<br/><font size='6.5' color='#78909C'>{src}</font>", td_s),
Paragraph(inds, td_s),
Paragraph(dose, tdc_s),
Paragraph(freq, tdc_s),
Paragraph(f"{cauts}<br/><font size='6.5' color='#1B5E20'><i>{special}</i></font>", td_s),
])
full_data = [hdr_row] + data_rows
t = Table(full_data, colWidths=COL_W, hAlign='LEFT')
style_cmds = [
('BACKGROUND', (0,0), (-1,0), hcol),
('GRID', (0,0), (-1,-1), 0.35, MID_GREY),
('VALIGN', (0,0), (-1,-1), 'TOP'),
('TOPPADDING', (0,0), (-1,-1), 3),
('BOTTOMPADDING', (0,0), (-1,-1), 3),
('LEFTPADDING', (0,0), (-1,-1), 4),
('RIGHTPADDING', (0,0), (-1,-1), 4),
]
for i in range(len(data_rows)):
row_bg = bgcol if i % 2 == 0 else WHITE
style_cmds.append(('BACKGROUND', (0, i+1), (-1, i+1), row_bg))
t.setStyle(TableStyle(style_cmds))
story.append(KeepTogether([t]))
story.append(Spacer(1, 8))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# QUICK REFERENCE TABLE
# ══════════════════════════════════════════════════════════════════════════════
story.append(chapter_banner("QUICK REFERENCE — CONDITION TO FIRST-LINE TINCTURE", DARK_NAVY))
story.append(Spacer(1, 6))
qr_data = [
# (condition, first_line_MTs, notes)
("Diabetes mellitus", "Syzygium jambolanum ø,\nGymnema sylvestre ø", "Monitor blood glucose"),
("Hypertension (mild)", "Rauwolfia serpentina ø,\nCrataegus ø", "Monitor BP; drug interactions"),
("Cardiac weakness / tonic", "Crataegus ø,\nTerminalia arjuna ø", "Long-term use safe"),
("Angina pectoris", "Cactus grandiflorus ø,\nCrataegus ø", "Adjunct; do not replace nitrates"),
("Hepatitis / liver disease", "Chelidonium ø,\nCardus marianus ø", "Monitor LFTs"),
("Jaundice (catarrhal)", "Berberis vulgaris ø,\nMyrica cerifera ø", "Investigate cause"),
("Gallstones / biliary colic", "Berberis vulgaris ø,\nChelidonium ø", "Adjunct to imaging/surgery"),
("Renal calculi / colic", "Berberis vulgaris ø,\nHydrangea ø", "Adequate hydration essential"),
("UTI / cystitis (acute)", "Cantharis ø,\nUva ursi ø", "Dose every 2 hrs acutely"),
("BPH / prostate", "Sabal serrulata ø,\nHydrangea ø", "Check PSA/USG"),
("Bronchial asthma", "Justicia adhatoda ø,\nBlatta orientalis ø", "Do not stop inhalers"),
("Acute bronchitis", "Justicia adhatoda ø,\nOcimum sanctum ø", "Every 2 hrs if acute"),
("Whooping cough", "Drosera ø,\nIpecacuanha ø", "Confirm Bordetella first"),
("Trauma / bruising", "Arnica montana ø,\nCalendula ø (wound)", "Arnica internal; Calendula topical"),
("Fracture healing", "Symphytum ø,\nCalcarea phos ø", "Adjunct; never replace casting"),
("Gout (acute)", "Colchicum ø,\nLedum ø", "Low-dose; check uric acid"),
("Arthritis / rheumatism", "Rhus tox ø,\nArnica ø", "Worse first motion → Rhus tox"),
("Spasmodic dysmenorrhoea", "Viburnum opulus ø,\nCimicifuga ø", "Start 2 days before expected"),
("Amenorrhoea (young girl)", "Senecio aureus ø,\nHelonias ø", "Rule out pregnancy first"),
("Menopausal symptoms", "Cimicifuga ø,\nSanguinaria ø", "Adjunct to hormonal review"),
("Varicose veins", "Hamamelis ø,\nMillefolium ø", "Topical + internal"),
("Haemorrhoids", "Hamamelis ø,\nAloe ø", "Topical Hamamelis lotion"),
("Warts / condylomata", "Thuja ø (topical + internal)", "Apply neat topically on wart"),
("Eczema (adult)", "Berberis aquifolium ø,\nHydrocotyle ø", "Also treat liver"),
("Eczema (child)", "Viola tricolor ø", "Halve dose for children"),
("Acne", "Berberis aquifolium ø,\nKali bromatum ø", "Liver drainage adjunct"),
("Wounds / ulcers", "Calendula ø (topical)", "Dilute 20 drops in 200 mL water"),
("Burns (first degree)", "Cantharis ø (topical),\nCalendula ø", "Dilute; cool water first"),
("Nerve injuries (puncture)", "Hypericum ø,\nLedum ø", "Ledum for puncture; Hypericum for nerve"),
("Insomnia", "Passiflora ø,\nAvena sativa ø", "At bedtime; combine both"),
("Anxiety / stress", "Avena sativa ø,\nGelsemium ø", "Before exam/performance: Gelsemium"),
("Nervous exhaustion", "Avena sativa ø,\nValeriana ø", "Daily tonic; safe long-term"),
("Immune deficiency / boils", "Echinacea ø,\nThuja ø", "Do not use Echinacea >8 weeks"),
("Tonsillitis / throat", "Phytolacca ø,\nHydrastis ø", "Dark red throat → Phytolacca"),
("Sinusitis", "Kali bichromicum ø,\nHydrastis ø", "Ropy stringy discharge keynote"),
("Adenoids (child)", "Agraphis nutans ø", "Safe for children; long-term"),
("Conjunctivitis / allergic eyes", "Euphrasia ø (topical + internal)", "Dilute 1:50 for eye wash"),
("Early cataract", "Cineraria maritima ø (eye drops)", "Commercial preparation preferred"),
("General tonic / weight gain", "Alfalfa ø,\nChina ø", "Safe daily; palatable"),
("Anaemia", "Ferrum ø,\nAlfalfa ø", "Investigate anaemia cause"),
("Malaria / periodic fever", "China ø,\nEucalyptus ø", "Confirm diagnosis; antimalarial backup"),
("Intestinal worms", "Spigelia ø,\nChenopodium ø", "Monitor with stool examination"),
]
qr_headers = [th("Condition"), th("First-Line Mother Tincture(s)"), th("Notes / Cautions")]
qr_rows = [[td(c), td(mt), Paragraph(n, note)] for c, mt, n in qr_data]
qr_t = Table([qr_headers] + qr_rows,
colWidths=[4.5*cm, 5.5*cm, 6.2*cm], hAlign='LEFT')
qr_t.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,0), DARK_NAVY),
('ROWBACKGROUNDS',(0,1), (-1,-1), [PALE_GREEN, WHITE]),
('GRID', (0,0), (-1,-1), 0.35, MID_GREY),
('TOPPADDING', (0,0), (-1,-1), 3),
('BOTTOMPADDING', (0,0), (-1,-1), 3),
('LEFTPADDING', (0,0), (-1,-1), 5),
('RIGHTPADDING', (0,0), (-1,-1), 5),
('VALIGN', (0,0), (-1,-1), 'TOP'),
]))
story.append(qr_t)
story.append(Spacer(1, 8))
# ══════════════════════════════════════════════════════════════════════════════
# GENERAL DOSING & SAFETY NOTES
# ══════════════════════════════════════════════════════════════════════════════
story.append(PageBreak())
story.append(chapter_banner("GENERAL DOSING, PREPARATION & SAFETY NOTES", SLATE))
story.append(Spacer(1, 6))
dosing_data = [
["Standard adult dose", "10–15 drops in ½ cup (100–150 mL) water, 2–3× daily unless stated"],
["Acute conditions", "Increase frequency — every 15–30 min (very acute) or every 2 hrs; "
"reduce frequency as symptoms improve"],
["Children (6–12 yrs)", "Half adult dose (5–8 drops) diluted in water"],
["Children (under 6 yrs)", "Quarter dose (3–5 drops); always dilute; "
"consult qualified homoeopath"],
["Topical use", "Dilute 20 drops in 200 mL cooled boiled water for wound dressings/wash; "
"never apply most tinctures neat to broken skin"],
["Alcohol content", "Mother tinctures contain 65–90% ethanol; "
"individuals avoiding alcohol should dilute in hot water (evaporates alcohol) or consult physician"],
["Storage", "Cool, dark location; away from strong odours (camphor, menthol, eucalyptus); "
"keep away from direct sunlight and electromagnetic devices"],
["Shelf life", "Typically 5 years from manufacture date when stored correctly; "
"check HPI guidelines on label"],
["Dosage form in India", "Prescribed in drops diluted in water; "
"available from licensed homoeopathic pharmacies under Drugs & Cosmetics Act 1940"],
["Drug interactions", "Cardioactive tinctures (Digitalis, Convallaria, Strophanthus): "
"interact with cardiac glycosides. Rauwolfia: interacts with antihypertensives. "
"Hypericum: interacts with antidepressants and OCP. Always disclose to allopathic physician."],
["Pregnancy caution", "AVOID in pregnancy unless supervised: Thuja, Berberis, Caulophyllum, "
"Senecio, Ruta, Hydrastis, Nux vomica, Lobelia, Abroma, Sanguinaria, Colchicum, Staphisagria"],
["High-risk tinctures\n(low therapeutic index)", "Digitalis ø, Strophanthus ø, Colchicum ø, "
"Lobelia ø, Cantharis ø (internal), Phosphorus ø, Nux vomica ø, Chenopodium ø — "
"use ONLY at recommended doses; overdose causes serious toxicity"],
["Regulatory status (India)", "Regulated under the Homoeopathic Pharmacopoeia of India (HPI), "
"Drugs & Cosmetics Act 1940; dispensed by licensed pharmacies; "
"prescription required for many Schedule H preparations"],
["Disclaimer", "This guide is for educational/reference use only. "
"Homoeopathic treatment requires individualization by a qualified homoeopath. "
"Mother tinctures are NOT a replacement for emergency or specialist care. "
"Always consult a qualified practitioner for diagnosis and treatment."],
]
dosing_hdr = [th("Parameter"), th("Guideline")]
dosing_rows = [[Paragraph(f"<b>{k}</b>", td_s), Paragraph(v, td_s)]
for k, v in dosing_data]
dosing_t = Table([dosing_hdr] + dosing_rows,
colWidths=[4.0*cm, BODY_W - 4.0*cm], hAlign='LEFT')
dosing_t.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,0), SLATE),
('ROWBACKGROUNDS',(0,1), (-1,-1), [LIGHT_GREY, WHITE]),
('GRID', (0,0), (-1,-1), 0.35, MID_GREY),
('TOPPADDING', (0,0), (-1,-1), 4),
('BOTTOMPADDING', (0,0), (-1,-1), 4),
('LEFTPADDING', (0,0), (-1,-1), 6),
('RIGHTPADDING', (0,0), (-1,-1), 6),
('VALIGN', (0,0), (-1,-1), 'TOP'),
# Highlight danger row
('BACKGROUND', (0,11), (-1,11), HexColor("#FFEBEE")),
('BACKGROUND', (0,13), (-1,13), HexColor("#FFFDE7")),
]))
story.append(dosing_t)
story.append(Spacer(1, 8))
story.append(hr(GOLD, 1.5))
story.append(Spacer(1, 4))
ref_text = (
"<b>Sources:</b> "
"Boericke W. <i>Pocket Manual of Homoeopathic Materia Medica</i>. B. Jain Publishers, New Delhi. | "
"Clarke JH. <i>A Dictionary of Practical Materia Medica</i>. | "
"Homoeopathic Pharmacopoeia of India (HPI). | "
"Phatak SR. <i>Materia Medica of Homeopathic Medicines</i>. B. Jain Publishers. | "
"Singhal V. Common 50 Homoeopathic Mother Tinctures. <i>Int J Homoeopathic Sciences</i> 2024. | "
"CCRH India clinical guidelines."
)
story.append(p(ref_text, note))
# ── BUILD ─────────────────────────────────────────────────────────────────────
doc.build(story, onFirstPage=on_page, onLaterPages=on_page)
print(f"SUCCESS: {OUTPUT}")
cd /home/daytona/workspace/homoeopathy-pdf && python3 generate_mt_guide.py 2>&1
python3 -c " from pypdf import PdfReader r = PdfReader('/home/daytona/workspace/homoeopathy-pdf/Homoeopathic_Mother_Tinctures_Guide.pdf') print(f'Total pages: {len(r.pages)}') import os size = os.path.getsize('/home/daytona/workspace/homoeopathy-pdf/Homoeopathic_Mother_Tinctures_Guide.pdf') print(f'File size: {size/1024:.1f} KB') for i, pg in enumerate(r.pages[:5]): txt = pg.extract_text()[:100].replace('\n',' ') print(f' p{i+1}: {txt}') print(' ...') for i, pg in enumerate(r.pages[-3:]): idx = len(r.pages)-3+i+1 txt = pg.extract_text()[:100].replace('\n',' ') print(f' p{idx}: {txt}') "
Homoeopathic Mother Tinctures Guide
PDF Document · PDF
| Pages | Content |
|---|---|
| 1 | Cover title page + Introduction to Mother Tinctures + Table of Contents |
| 2 | Group 1 - Immune & Anti-Infective (Echinacea, Thuja, Baptisia, Calendula, Phytolacca, Ocimum, Pyrogenium) |
| 3–4 | Group 2 - Cardiovascular (Crataegus, Digitalis, Cactus, Terminalia arjuna, Rauwolfia, Convallaria, Strophanthus, Adonis) |
| 5–6 | Group 3 - Liver & Digestive (Chelidonium, Cardus marianus, Berberis, Taraxacum, Nux vomica, Hydrastis, Aloe, Picrorhiza, Chionanthus, Myrica) |
| 7 | Group 4 - Kidney & Urinary (Cantharis, Berberis, Solidago, Uva ursi, Pareira, Hydrangea, Senecio) |
| 8–9 | Group 5 - Respiratory (Justicia adhatoda, Blatta orientalis, Grindelia, Ipecac, Lobelia, Drosera, Eucalyptus, Bryonia, Senega) |
| 10 | Group 6 - Nervous System (Avena sativa, Passiflora, Valeriana, Hypericum, Gelsemium, Coffea, Kali brom) |
| 11 | Group 7 - Endocrine & Metabolic (Syzygium, Gymnema, Abroma, Momordica, Thyroidinum, Chionanthus) |
| 12–13 | Group 8 - Musculoskeletal (Arnica, Rhus tox, Ruta, Symphytum, Ledum, Bellis, Colchicum, Cimicifuga) |
| 14 | Group 9 - Dermatology (Berberis aquifolium, Hydrocotyle, Viola, Thuja, Cantharis topical, Calendula) |
| 15 | Group 10 - Women's Health (Caulophyllum, Viburnum, Helonias, Aletris, Senecio, Hamamelis, Mitchella) |
| 16 | Group 11 - Men's Health (Sabal serrulata, Agnus castus, Damiana, Staphisagria) |
| 17 | Group 12 - Paediatric & Tonic (Alfalfa, China, Abrotanum, Calcarea phos, Ferrum) |
| 18 | Group 13 - Haematological & Venous (Hamamelis, Millefolium, Trillium, Phosphorus) |
| 19 | Group 14 - ENT & Eye (Euphrasia, Agraphis, Cineraria, Sanguinaria, Hydrastis, Kali bich) |
| 20 | Group 15 - Fever & Anti-Parasitic (China, Eucalyptus, Spigelia, Chenopodium, Abrotanum) |
| 21–22 | Quick Reference Table - 42 common conditions mapped to first-line tinctures |
| 23 | General Dosing, Preparation & Safety Notes (including pregnancy caution list, high-risk tinctures, drug interactions) |
Kindly make a PDF for treating Anabolic Androgenic Steroid induced hypogonadism and also to restore fertility according to recent medical research guidelines .
"anabolic androgenic steroids" AND "hypogonadism" AND "treatment"
"AAS induced hypogonadism" AND "fertility" AND "clomiphene" OR "hCG"
anabolic androgenic steroid induced hypogonadism ASIH treatment protocol 2024 2025 fertility restoration guidelines
PMID: 33887077
PMID: 35216717
PMID: 40678315
https://wjmh.org/search.php?where=aview&id=10.5534%2Fwjmh.19…
ASIH post cycle therapy protocol clomiphene tamoxifen HCG dosing monitoring testosterone recovery 2023 2024
"post cycle therapy" AND "testosterone" AND "clomiphene" AND "spermatogenesis"
~/homoeopathy-pdf/generate_asih_pdf.py
#!/usr/bin/env python3
"""
AAS-Induced Hypogonadism (ASIH) — Clinical Management & Fertility Restoration
PDF Guide based on Harrison's 22E (2025), PubMed systematic reviews,
and current clinical practice protocols.
"""
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import cm, mm
from reportlab.lib.styles import ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, KeepTogether, PageBreak
)
from reportlab.lib.colors import HexColor
OUTPUT = "/home/daytona/workspace/homoeopathy-pdf/ASIH_Management_Fertility_Guide.pdf"
W, H = A4
LM, RM, TM, BM = 1.8*cm, 1.8*cm, 1.8*cm, 1.8*cm
BW = W - LM - RM
# ── Palette ───────────────────────────────────────────────────────────────────
NAVY = HexColor("#1A2F5E")
ROYAL = HexColor("#2155A3")
STEEL = HexColor("#3A7FBD")
PALE_BLUE = HexColor("#E8F1FB")
TEAL = HexColor("#0B6E6E")
PALE_TEAL = HexColor("#E0F4F4")
DARK_RED = HexColor("#8B1A1A")
PALE_RED = HexColor("#FFF0F0")
ORANGE = HexColor("#D05C00")
PALE_ORG = HexColor("#FFF5EC")
GREEN = HexColor("#1A6B2E")
PALE_GRN = HexColor("#EBF7EE")
PURPLE = HexColor("#5B2C8D")
PALE_PUR = HexColor("#F5EEFF")
AMBER = HexColor("#B8860B")
PALE_AMB = HexColor("#FFFDE7")
SLATE = HexColor("#455A64")
LGREY = HexColor("#F4F6F9")
MGREY = HexColor("#90A4AE")
WHITE = colors.white
BLACK = colors.black
# ── Styles ────────────────────────────────────────────────────────────────────
def S(name, **kw): return ParagraphStyle(name, **kw)
base = S('b', fontName='Helvetica', fontSize=8.5, leading=12, textColor=BLACK)
bodyj = S('bj', parent=base, alignment=TA_JUSTIFY, spaceAfter=3)
body = S('bl', parent=base, alignment=TA_LEFT, spaceAfter=3)
small = S('sm', parent=base, fontSize=7.5, leading=10, textColor=SLATE)
note = S('nt', parent=base, fontSize=7, leading=9.5, textColor=SLATE,
fontName='Helvetica-Oblique')
th_s = S('th', parent=base, fontSize=8, fontName='Helvetica-Bold',
textColor=WHITE, alignment=TA_CENTER)
td_s = S('td', parent=base, fontSize=8, leading=10.5)
tdc_s = S('tc', parent=base, fontSize=8, leading=10.5, alignment=TA_CENTER)
tdb_s = S('tb', parent=base, fontSize=8, leading=10.5, fontName='Helvetica-Bold')
tdb_c = S('tbc',parent=base, fontSize=8, leading=10.5,
fontName='Helvetica-Bold', alignment=TA_CENTER)
h1 = S('h1', parent=base, fontSize=11, fontName='Helvetica-Bold',
textColor=WHITE, alignment=TA_LEFT)
h2 = S('h2', parent=base, fontSize=9, fontName='Helvetica-Bold',
textColor=NAVY)
warn = S('wn', parent=base, fontSize=8, fontName='Helvetica-Bold',
textColor=DARK_RED)
ok = S('ok', parent=base, fontSize=8, fontName='Helvetica-Bold',
textColor=GREEN)
bullet= S('bu', parent=base, fontSize=8.5, leftIndent=12, spaceAfter=2)
def p(t, st=body): return Paragraph(t, st)
def th(t): return Paragraph(t, th_s)
def td(t): return Paragraph(t, td_s)
def tdc(t): return Paragraph(t, tdc_s)
def tdb(t): return Paragraph(t, tdb_s)
def tdb_c_(t): return Paragraph(t, tdb_c)
def hr(c=STEEL, th_=0.5):
return HRFlowable(width="100%", thickness=th_, color=c, spaceAfter=4, spaceBefore=4)
def banner(text, fg=NAVY, sub=None):
rows = [[Paragraph(text, h1)]]
if sub:
rows.append([Paragraph(sub, S('bs', parent=base, fontSize=7.5,
textColor=HexColor("#A8C8F0"), alignment=TA_LEFT))])
t = Table(rows, colWidths=[BW])
t.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), fg),
('LEFTPADDING', (0,0), (-1,-1), 10),
('RIGHTPADDING', (0,0), (-1,-1), 10),
('TOPPADDING', (0,0), (-1,-1), 7),
('BOTTOMPADDING', (0,0), (-1,-1), 7),
]))
return t
def info_box(text, fg=PALE_BLUE, border=ROYAL):
t = Table([[Paragraph(text, bodyj)]], colWidths=[BW])
t.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), fg),
('BOX', (0,0), (-1,-1), 0.8, border),
('LEFTPADDING', (0,0), (-1,-1), 10),
('RIGHTPADDING', (0,0), (-1,-1), 10),
('TOPPADDING', (0,0), (-1,-1), 7),
('BOTTOMPADDING', (0,0), (-1,-1), 7),
]))
return t
def warn_box(text):
return info_box(f"<b>⚠ IMPORTANT:</b> {text}", PALE_RED, DARK_RED)
def ok_box(text):
return info_box(f"<b>✔ NOTE:</b> {text}", PALE_GRN, GREEN)
def btable(hdrs, rows, cols, hc=NAVY, rb1=PALE_BLUE, rb2=WHITE):
data = [hdrs] + rows
t = Table(data, colWidths=cols, hAlign='LEFT')
cmds = [
('BACKGROUND', (0,0), (-1,0), hc),
('ROWBACKGROUNDS',(0,1), (-1,-1), [rb1, rb2]),
('GRID', (0,0), (-1,-1), 0.35, MGREY),
('VALIGN', (0,0), (-1,-1), 'TOP'),
('TOPPADDING', (0,0), (-1,-1), 4),
('BOTTOMPADDING', (0,0), (-1,-1), 4),
('LEFTPADDING', (0,0), (-1,-1), 5),
('RIGHTPADDING', (0,0), (-1,-1), 5),
]
t.setStyle(TableStyle(cmds))
return t
# Page numbering
pn = [0]
def on_page(c, doc):
pn[0] += 1
c.saveState()
c.setFillColor(NAVY)
c.rect(LM, BM - 13, BW, 13, fill=1, stroke=0)
c.setFillColor(WHITE)
c.setFont('Helvetica', 7)
c.drawString(LM + 5, BM - 10,
"AAS-Induced Hypogonadism (ASIH) — Clinical Management & Fertility Restoration Guide")
c.drawRightString(LM + BW - 5, BM - 10, f"Page {pn[0]}")
c.setFillColor(HexColor("#C9A84C"))
c.rect(LM, H - TM + 2, BW, 3, fill=1, stroke=0)
c.restoreState()
doc = SimpleDocTemplate(
OUTPUT, pagesize=A4,
topMargin=TM + 4, bottomMargin=BM + 16,
leftMargin=LM, rightMargin=RM,
title="AAS-Induced Hypogonadism — Clinical Management & Fertility Restoration",
author="Based on Harrison's 22E 2025, PubMed systematic reviews",
subject="ASIH Diagnosis Treatment Fertility"
)
story = []
# ═══════════════════════════════════════════════════════════════════════════════
# COVER
# ═══════════════════════════════════════════════════════════════════════════════
cover = Table([
[Paragraph("ANABOLIC ANDROGENIC STEROID-INDUCED", S('ct1', fontName='Helvetica',
fontSize=14, textColor=HexColor("#A8C8F0"), alignment=TA_CENTER))],
[Paragraph("HYPOGONADISM (ASIH)", S('ct2', fontName='Helvetica-Bold',
fontSize=28, textColor=WHITE, alignment=TA_CENTER))],
[Spacer(1, 6)],
[Paragraph("Clinical Management & Fertility Restoration", S('ct3', fontName='Helvetica-Bold',
fontSize=14, textColor=HexColor("#FFD700"), alignment=TA_CENTER))],
[Spacer(1, 8)],
[Paragraph("A Evidence-Based Clinical Reference Guide", S('ct4', fontName='Helvetica-Oblique',
fontSize=10, textColor=HexColor("#90CAF9"), alignment=TA_CENTER))],
[Spacer(1, 6)],
[Paragraph(
"Sources: Harrison's Principles of Internal Medicine 22E (McGraw-Hill, 2025) • "
"Vilar Neto et al. Andrologia 2021 (Systematic Review, PMID 33887077) • "
"Pope & Kanayama, Endocrinol Metab Clin N Am 2022 (PMID 35216717) • "
"van Os et al. Front Endocrinol 2025 (PMID 40678315) • "
"World J Mens Health 2020 — AAS Fertility Management Protocol",
S('ct5', fontName='Helvetica', fontSize=7.5, textColor=HexColor("#78909C"),
alignment=TA_CENTER))],
], colWidths=[BW])
cover.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), NAVY),
('TOPPADDING', (0,0), (-1,-1), 10),
('BOTTOMPADDING', (0,0), (-1,-1), 10),
('LEFTPADDING', (0,0), (-1,-1), 20),
('RIGHTPADDING', (0,0), (-1,-1), 20),
]))
story.append(cover)
story.append(Spacer(1, 8))
# ── Epidemiology box ──────────────────────────────────────────────────────────
story.append(info_box(
"<b>Epidemiology & Clinical Significance:</b> Anabolic-androgenic steroid (AAS) misuse "
"is a major global public health concern. ASIH is now the most common cause of <b>profound "
"hypogonadotropic hypogonadism in young men</b>. Up to <b>25% of young men</b> receiving "
"testosterone replacement therapy at men's health clinics have AAS withdrawal hypogonadism "
"(Harrison's 22E, 2025). Up to <b>30% of AAS users develop dependence</b>. In 2023, 91% "
"of men who stopped AAS developed at least one hypogonadal symptom. A 2021 systematic review "
"found full HPG axis recovery in only <b>4 of 38</b> well-documented cases — "
"underscoring the severity and underrecognised nature of this condition.",
PALE_BLUE, ROYAL
))
story.append(Spacer(1, 8))
# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 1 — PATHOPHYSIOLOGY
# ═══════════════════════════════════════════════════════════════════════════════
story.append(banner("1. PATHOPHYSIOLOGY OF ASIH", NAVY,
"How AAS suppresses the HPG axis"))
story.append(Spacer(1, 5))
story.append(p(
"AAS exert their suppressive effect through <b>negative feedback on the hypothalamic-pituitary-gonadal (HPG) axis</b>. "
"Supraphysiologic levels of androgens (and their oestrogen metabolites) suppress GnRH pulsatility from the hypothalamus, "
"reducing LH and FSH secretion from the pituitary. This leads to Leydig cell atrophy, reduced intratesticular testosterone, "
"and failure of spermatogenesis.", bodyj))
# Pathophysiology table
path_hdrs = [th("Level"), th("Normal Function"), th("Effect of AAS Excess"), th("Clinical Consequence")]
path_rows = [
[td("<b>Hypothalamus</b>"), td("GnRH pulses stimulate pituitary"), td("↓ GnRH pulsatility via androgen/oestrogen feedback"), td("↓ LH and FSH from pituitary")],
[td("<b>Anterior Pituitary</b>"), td("LH stimulates Leydig cells;\nFSH stimulates Sertoli cells"), td("Severely suppressed LH and FSH — often undetectable"), td("Testicular atrophy;\nazoospermia")],
[td("<b>Leydig Cells (Testes)</b>"), td("Produce testosterone in response to LH"), td("Atrophy and loss of function without LH stimulation"), td("↓↓ endogenous testosterone;\ntesticular volume loss")],
[td("<b>Sertoli Cells (Testes)</b>"), td("Support spermatogenesis under FSH"), td("FSH withdrawal → impaired spermatogenesis"), td("Oligospermia or azoospermia")],
[td("<b>SHBG</b>"), td("Binds/transports testosterone"), td("Suppressed by AAS → more free testosterone initially"), td("Dysregulation of free:total T ratio")],
[td("<b>Oestradiol Feedback</b>"), td("Modulates hypothalamic sensitivity"), td("Elevated E2 from aromatisation amplifies GnRH suppression"), td("Gynecomastia; sustained HPG suppression")],
]
story.append(btable(path_hdrs, path_rows, [2.5*cm, 3.8*cm, 5.0*cm, 4.9*cm], NAVY, PALE_BLUE))
story.append(Spacer(1, 5))
story.append(p(
"<b>Duration and severity of suppression</b> depends on: dose and duration of AAS use, "
"the specific AAS compounds used (17α-alkylated oral AAS cause deeper suppression), "
"whether ester-based injectables were used (long half-lives delay recovery), and individual "
"genetic variability in HPG axis resilience. "
"<b>Prolonged Post-Androgen Abuse Hypogonadism (PPAAH)</b> is defined (van Os et al., 2025) "
"as persistent hypogonadism <b>6 months after cessation</b>, with cumulative AAS exposure "
"≥150 mg/week for ≥6 months, after excluding other causes.", bodyj))
story.append(Spacer(1, 6))
# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 2 — CLINICAL FEATURES
# ═══════════════════════════════════════════════════════════════════════════════
story.append(banner("2. CLINICAL FEATURES & DIAGNOSIS", ROYAL,
"Recognising ASIH after steroid cessation"))
story.append(Spacer(1, 5))
# Two-column clinical features
cf_left = [
"<b>Symptoms of Hypogonadism:</b>",
"• Sexual dysfunction (ED, ↓ libido)",
"• Severe fatigue and lethargy",
"• Depressive symptoms (± suicidality)",
"• Mood instability, irritability",
"• Hot flushes",
"• Gynaecomastia",
"• Loss of muscle mass and strength",
"• Cognitive difficulties",
"• Infertility / inability to conceive",
]
cf_right = [
"<b>Physical Examination:</b>",
"• Testicular atrophy (↓ volume)",
"• Gynaecomastia",
"• Loss of body/facial hair",
"• Striae, acne scarring",
"• Reduced muscle bulk",
"<b>Note:</b> AAS users may deny use —",
" enquire sensitively and non-judgementally.",
" Drug testing and clinical correlates",
" may be required to confirm.",
]
cf_rows = [[Paragraph('\n'.join(cf_left), td_s), Paragraph('\n'.join(cf_right), td_s)]]
cf_t = Table(cf_rows, colWidths=[BW/2, BW/2])
cf_t.setStyle(TableStyle([
('BACKGROUND', (0,0), (0,0), PALE_BLUE),
('BACKGROUND', (1,0), (1,0), PALE_TEAL),
('BOX', (0,0), (-1,-1), 0.5, MGREY),
('INNERGRID', (0,0), (-1,-1), 0.5, MGREY),
('TOPPADDING', (0,0), (-1,-1), 8),
('BOTTOMPADDING', (0,0), (-1,-1), 8),
('LEFTPADDING', (0,0), (-1,-1), 10),
('RIGHTPADDING', (0,0), (-1,-1), 10),
('VALIGN', (0,0), (-1,-1), 'TOP'),
]))
story.append(cf_t)
story.append(Spacer(1, 6))
# ── Diagnostic Lab Panel ──────────────────────────────────────────────────────
story.append(p("<b>Diagnostic Laboratory Evaluation</b>", h2))
story.append(Spacer(1, 3))
lab_hdrs = [th("Test"), th("Finding in ASIH"), th("Normal Range"), th("Clinical Significance")]
lab_rows = [
[td("Total Testosterone"), tdc("Very low / undetectable\n(<200 ng/dL typical)"), tdc("300–1000 ng/dL"), td("Confirms hypogonadism; baseline for treatment")],
[td("Free Testosterone"), tdc("Low"), tdc("5–21 ng/dL"), td("Better reflects bioavailable T")],
[td("LH (Luteinising Hormone)"), tdc("Low / undetectable\n(hypogonadotropic pattern)"), tdc("1.7–8.6 IU/L"), td("Distinguishes ASIH (low LH) from primary gonadal failure (high LH)")],
[td("FSH (Follicle Stimulating Hormone)"), tdc("Low / undetectable"), tdc("1.5–12.4 IU/L"), td("Low FSH confirms HPG suppression; governs spermatogenesis")],
[td("Oestradiol (E2)"), tdc("May be elevated\n(from aromatisation)"), tdc("10–40 pg/mL"), td("Elevated E2 perpetuates HPG suppression; guides AI use")],
[td("SHBG"), tdc("Suppressed"), tdc("16–55 nmol/L"), td("AAS suppress SHBG; monitor during recovery")],
[td("Prolactin"), tdc("Usually normal\n(rule out prolactinoma)"), tdc("< 15 ng/mL"), td("Exclude pituitary adenoma as co-cause")],
[td("Semen Analysis (SA)"), tdc("Oligospermia or\nazoospermia"), tdc("WHO: >15M/mL;\n>32% motility"), td("Baseline for fertility; repeat every 2–3 months during treatment")],
[td("Testicular Ultrasound"), tdc("Atrophy; ↓ volume"), tdc("15–25 mL each"), td("Assess testicular parenchyma, rule out mass")],
[td("Full Blood Count"), tdc("May show polycythaemia\n(↑ Hct/Hgb from prior AAS)"), tdc("Hgb 13.5–17.5 g/dL"), td("High Hct = thrombosis risk; may need phlebotomy")],
[td("Lipid Profile"), tdc("↓ HDL, ↑ LDL\n(from AAS use)"), tdc("HDL >40; LDL <130"), td("Cardiovascular risk assessment mandatory")],
[td("LFTs (Liver Function)"), tdc("May be elevated\n(especially if oral AAS)"), tdc("ALT <40 IU/L"), td("17α-alkylated AAS cause hepatotoxicity; cholestasis, peliosis")],
[td("HbA1c / Fasting Glucose"), tdc("May be impaired"), tdc("HbA1c <5.7%"), td("Supraphysiologic T → insulin resistance")],
[td("PSA (if >40 yrs)"), tdc("Possibly elevated"), tdc("< 4.0 ng/mL"), td("Baseline prior to any testosterone therapy")],
[td("Bone Density (DEXA)\n— if chronic use"), tdc("Osteopenia / osteoporosis"), tdc("T-score > −1.0"), td("Prolonged hypogonadism causes bone loss")],
]
story.append(btable(lab_hdrs, lab_rows, [3.2*cm, 2.8*cm, 2.6*cm, 7.6*cm], NAVY, PALE_BLUE))
story.append(Spacer(1, 5))
story.append(warn_box(
"ASIH is a diagnosis of exclusion — rule out other causes: primary gonadal failure (Klinefelter's), "
"pituitary adenoma/prolactinoma, haemochromatosis, chronic illness, obesity-related hypogonadism, and "
"other medications (opioids, corticosteroids, antipsychotics)."))
story.append(Spacer(1, 8))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 3 — TREATMENT OVERVIEW
# ═══════════════════════════════════════════════════════════════════════════════
story.append(banner("3. TREATMENT OVERVIEW — DECISION PATHWAY", TEAL,
"Initial approach depends on fertility goals and severity"))
story.append(Spacer(1, 5))
story.append(info_box(
"<b>Step 1 — Establish Fertility Intent:</b> Before initiating any treatment, the clinician must "
"determine whether the patient desires fertility <b>now or in the future</b>. This is the primary "
"decision branch. Testosterone replacement therapy (TRT) is <b>contraindicated</b> in men who wish "
"to restore or preserve fertility, as it further suppresses FSH and spermatogenesis.",
PALE_TEAL, TEAL))
story.append(Spacer(1, 5))
# Decision table
dec_hdrs = [th("Patient Profile"), th("Primary Goal"), th("First-Line Strategy")]
dec_rows = [
[td("<b>Wants fertility now\n(< 6 months)"), td("Restore spermatogenesis;\nrecover HPG axis"), td("STOP all AAS/TTh immediately\nStart HCG 3,000 IU every other day + Clomiphene 25–50 mg daily\nSemen analysis every 2–3 months")],
[td("<b>Wants fertility in 6–12 months</b>"), td("Maintain function;\nprepare for fertility"), td("Can continue AAS/TTh temporarily\nAdd HCG 500 IU every other day ± Clomiphene 25 mg daily\nPlan cessation 3–6 months before conception attempt")],
[td("<b>Wants fertility in > 12 months</b>"), td("Maintain current function;\nplan future"), td("Continue TTh/AAS with HCG 500 IU every other day co-administration\nObtain baseline semen analysis to rule out occult issues")],
[td("<b>No fertility intent;\nsymptomatic ASIH</b>"), td("Resolve hypogonadal symptoms\n(fatigue, ED, depression)"), td("PCT with Clomiphene ± Tamoxifen\nIf HPG axis fails to recover >6 months: consider TRT\nPsychological support essential")],
[td("<b>PPAAH\n(≥6 months post-cessation,\nstill hypogonadal)</b>"), td("Achieve durable HPG recovery\nor long-term TRT"), td("Trial HCG + SERM for 3–6 months\nIf failure: TRT as definitive therapy\nLifelong monitoring required")],
]
story.append(btable(dec_hdrs, dec_rows, [3.5*cm, 3.5*cm, 9.2*cm], TEAL, PALE_TEAL))
story.append(Spacer(1, 8))
# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 4 — PHARMACOLOGICAL AGENTS
# ═══════════════════════════════════════════════════════════════════════════════
story.append(banner("4. PHARMACOLOGICAL AGENTS — MECHANISMS & DOSING", NAVY,
"Drugs used for HPG axis recovery and spermatogenesis restoration"))
story.append(Spacer(1, 5))
drug_data = [
# (Name, Class, MOA, Dose, Duration, Monitoring, AEs, Special)
(
"Human Chorionic\nGonadotropin (hCG)",
"LH Analogue\n(Gonadotropin)",
"Directly mimics LH at testicular Leydig cell LH receptors → "
"stimulates testosterone synthesis. Maintains/restores testicular volume. "
"Acts DISTAL to the suppressed hypothalamus/pituitary, making it effective "
"even when LH is undetectable. Does NOT stimulate FSH or spermatogenesis directly.",
"Fertility-intent:\n3,000 IU SC/IM every other day\n\nMaintenance/prevention:\n500 IU SC every other day\n\nPhase 1 PCT priming:\n500–1,500 IU SC 3× weekly × 4 weeks",
"Until sperm count recovers or\nHPG axis normalises;\noften 3–6 months",
"Serum T (target 400–700 ng/dL)\nEstradiol (aromatisation ↑)\nSemen analysis q2–3 months\nTesticular size",
"Gynaecomastia (E2 aromatisation)\nFluctuating T levels\nAntibody formation (rare, long-term)\nInjection site reactions",
"NEVER use hCG alone for fertility — it stimulates testosterone but not FSH/spermatogenesis. "
"Must combine with Clomiphene or FSH for sperm production. Monitor E2 and add AI if E2 excessively elevated."
),
(
"Clomiphene Citrate\n(Clomid)",
"Selective Oestrogen\nReceptor Modulator\n(SERM) — oral",
"Competitively blocks oestrogen receptors at hypothalamus and pituitary → "
"removes negative oestrogen feedback → ↑ GnRH pulsatility → ↑ LH + FSH secretion → "
"↑ endogenous testosterone and spermatogenesis. Acts CENTRALLY — "
"requires a functional pituitary gland. Also increases oestrogen activity in liver "
"(positive cholesterol effect).",
"25–50 mg orally once daily\n(start 25 mg; titrate based on response)\n\nAlternative: 25 mg daily × 5 days/week\n(reduces side effects)",
"Minimum 3 months for spermatogenesis;\noften 6–12 months;\nlong-term as needed",
"LH, FSH, Total T, E2 every 4–6 weeks\nSemen analysis q3 months\nTarget T ≥ 400 ng/dL\nTarget LH/FSH: rising toward normal",
"Visual disturbances (rare but serious — STOP if occurs)\nMood changes, hot flushes\nGynecomastia (partial E2 agonist in some tissues)\nTesticular enlargement (from stimulation)",
"2023 pilot study (Henriksen et al., CloTASH): clomiphene ± hCG significantly "
"improved T levels and HPG recovery in ASIH patients. "
"Off-label in males — widely used in men's health. Reduced urge to restart steroids by 60% in 2023 survey."
),
(
"Tamoxifen\n(Nolvadex)",
"Selective Oestrogen\nReceptor Modulator\n(SERM) — oral",
"Similar mechanism to clomiphene — blocks hypothalamic/pituitary oestrogen receptors "
"→ ↑ GnRH, LH, FSH, testosterone. Also anti-oestrogenic effect in breast tissue "
"(gynecomastia treatment). Less potent pituitary stimulation than clomiphene; "
"used when clomiphene is not tolerated or as adjunct for gynecomastia.",
"10–20 mg orally once daily\n\nFor gynecomastia specifically:\n20 mg daily × 3 months",
"As needed for gynecomastia;\n3–6 months for HPG recovery",
"LH, FSH, T, E2 every 4–6 weeks\nLiver function tests",
"Thrombosis risk (↑ coagulation factors)\nMood changes\nHot flushes\nEndometrial effects (not relevant in males)\nRarely: cataracts with prolonged use",
"Reserve for: (1) Gynecomastia management, (2) Clomiphene intolerance, "
"(3) Adjunct when additional anti-oestrogenic effect desired. "
"Some protocols use tamoxifen in rotation with clomiphene."
),
(
"Recombinant FSH\n(rFSH / Follitropin alfa)\n[e.g., Gonal-F, Puregon]",
"FSH Analogue\n(Gonadotropin)\n— injectable",
"Directly stimulates Sertoli cells via FSH receptors → promotes spermatogenesis. "
"hCG restores testosterone; rFSH initiates sperm production. Essential when "
"clomiphene fails to raise FSH sufficiently, particularly in men with deep "
"pituitary suppression or in severe/prolonged ASIH.",
"75–150 IU SC every other day\n(in combination with hCG)\n\nUsed ONLY when FSH remains\nlow despite adequate clomiphene trial",
"Often 6–18 months to achieve\nadequate spermatogenesis;\ntimed with SA monitoring",
"FSH levels, serum T, E2\nSemen analysis q3 months\nTesticular volume",
"Injection fatigue (frequent dosing)\nCost (expensive)\nOvarian hyperstimulation\n(not applicable in males)\nGynecomastia",
"Add rFSH when: (1) No FSH response after 3 months of clomiphene, or (2) Persistent "
"azoospermia on hCG + clomiphene combination. Per WJMH 2020 protocol: "
"discontinue clomiphene and add 75 IU rFSH every other day."
),
(
"Aromatase Inhibitors\n(AIs)\n[Anastrozole, Letrozole,\nExemestane]",
"Aromatase Enzyme\nInhibitors",
"Inhibit aromatase enzyme → prevent conversion of testosterone to oestradiol → "
"↓ oestradiol levels → reduces oestrogen negative feedback on HPG axis → "
"indirectly ↑ LH, FSH, and testosterone. Also prevents gynaecomastia from "
"hCG-driven aromatisation.",
"Anastrozole: 0.5–1 mg orally 2–3× weekly\nLetrozole: 2.5 mg 2–3× weekly\nExemestane: 12.5–25 mg 3× weekly\n\n(Not used routinely — only when E2 elevated)",
"As needed while E2 is elevated;\nuse minimum effective dose",
"Oestradiol (target 20–30 pg/mL)\nTotal testosterone\nBone density (long-term use)",
"Bone density loss (osteoporosis risk with sustained use)\nArthralgia, myalgia\nMood changes\nLipid effects\nExcessively low E2 → erectile dysfunction",
"USE ONLY IF ELEVATED E2 is confirmed on lab. Over-suppression of E2 causes ED "
"and bone loss. Target oestradiol 20–30 pg/mL — not zero. Not first-line; "
"adjunct only when aromatisation is driving symptom burden or HPG suppression."
),
(
"Testosterone Replacement\nTherapy (TRT)\n[Gels, Injections, Patches]",
"Androgen Replacement\n— exogenous testosterone",
"Replaces deficient testosterone directly. Does NOT restore HPG axis function; "
"further suppresses LH/FSH and spermatogenesis. Appropriate only when "
"HPG axis recovery has definitively failed (PPAAH unresponsive to PCT) "
"and the patient has no fertility intent.",
"Various forms:\nGel 1%: 50–100 mg/day topically\nCypionate/Enanthate: 100–200 mg IM q1–2 weeks\nUndecanoate (Nebido): 1000 mg IM q10–14 weeks\nPellets, patches: per protocol",
"Lifelong (if PPAAH/primary failure)\nRegular reassessment required",
"Total T (target 400–700 ng/dL)\nHaematocrit (< 54%)\nPSA annually (if >40 yrs)\nLipids, LFTs\nBone density",
"Polycythaemia (thrombosis risk)\nSuppression of fertility (permanent risk)\nSleep apnoea\nAcne, oily skin\nTesticular atrophy",
"<b>CONTRAINDICATED if fertility is desired.</b> "
"Used as definitive long-term therapy only after confirmed irreversible PPAAH, "
"failed PCT trials ≥6 months, and after thorough counselling about permanent "
"fertility suppression. Some specialists co-prescribe HCG 500 IU EOD with TRT "
"to maintain testicular volume."
),
]
for drug in drug_data:
name, cls, moa, dose, dur, mon, ae, special = drug
# Find colour by class
clr = {
"LH Analogue": (TEAL, PALE_TEAL),
"Selective Oestrogen": (PURPLE, PALE_PUR),
"FSH Analogue": (GREEN, PALE_GRN),
"Aromatase": (AMBER, PALE_AMB),
"Androgen": (DARK_RED, PALE_RED),
}
hcol, bgcol = NAVY, PALE_BLUE
for k, v in clr.items():
if k in cls:
hcol, bgcol = v
break
hdr_t = Table([[Paragraph(name, S('dh', parent=base, fontSize=9,
fontName='Helvetica-Bold', textColor=WHITE)),
Paragraph(cls, S('dc', parent=base, fontSize=8,
textColor=HexColor("#E0E0E0"), alignment=TA_RIGHT))]],
colWidths=[BW*0.55, BW*0.45])
hdr_t.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), hcol),
('TOPPADDING', (0,0), (-1,-1), 5),
('BOTTOMPADDING', (0,0), (-1,-1), 5),
('LEFTPADDING', (0,0), (-1,-1), 10),
('RIGHTPADDING', (0,0), (-1,-1), 10),
('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
]))
body_data = [
[Paragraph("<b>Mechanism of Action:</b>", tdb_s), Paragraph(moa, td_s)],
[Paragraph("<b>Dosing (Male):</b>", tdb_s), Paragraph(dose, td_s)],
[Paragraph("<b>Duration:</b>", tdb_s), Paragraph(dur, td_s)],
[Paragraph("<b>Monitoring:</b>", tdb_s), Paragraph(mon, td_s)],
[Paragraph("<b>Adverse Effects:</b>", tdb_s),
Paragraph(ae, S('ae', parent=base, fontSize=8, textColor=DARK_RED))],
[Paragraph("<b>Clinical Notes:</b>", tdb_s),
Paragraph(special, S('cn', parent=base, fontSize=8, textColor=GREEN, fontName='Helvetica-Oblique'))],
]
body_t = Table(body_data, colWidths=[2.6*cm, BW - 2.6*cm])
body_t.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), bgcol),
('GRID', (0,0), (-1,-1), 0.3, MGREY),
('TOPPADDING', (0,0), (-1,-1), 4),
('BOTTOMPADDING', (0,0), (-1,-1), 4),
('LEFTPADDING', (0,0), (-1,-1), 6),
('RIGHTPADDING', (0,0), (-1,-1), 6),
('VALIGN', (0,0), (-1,-1), 'TOP'),
]))
story.append(KeepTogether([hdr_t, body_t, Spacer(1, 5)]))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 5 — FERTILITY RESTORATION PROTOCOL
# ═══════════════════════════════════════════════════════════════════════════════
story.append(banner("5. FERTILITY RESTORATION PROTOCOL", GREEN,
"Step-by-step management for men desiring pregnancy — WJMH 2020 / Current Evidence"))
story.append(Spacer(1, 5))
story.append(info_box(
"<b>Fundamental Rule:</b> ALL men actively trying to achieve pregnancy should IMMEDIATELY "
"STOP all AAS and exogenous testosterone therapy. Continued use renders natural spermatogenesis "
"virtually impossible. Even men who have used AAS for years can recover fertility with appropriate "
"treatment, though recovery may take 12–24 months.",
PALE_GRN, GREEN))
story.append(Spacer(1, 5))
# Fertility protocol by time horizon
fert_hdrs = [th("Desired Pregnancy\nTimeline"), th("AAS/TTh Status"), th("Protocol"),
th("Monitoring"), th("Escalation if No Response")]
fert_rows = [
[
tdb_c_("<6 months\n(URGENT)"),
td("STOP all AAS/TTh\nimmediately"),
td("• hCG 3,000 IU SC/IM every other day\n• Clomiphene citrate 25–50 mg orally daily\n• Begin simultaneously at cessation"),
td("• Semen analysis every 2–3 months\n• LH, FSH, T, E2 every 4–6 weeks\n• If no FSH response by month 3: escalate"),
td("Discontinue clomiphene;\nAdd rFSH 75 IU SC every other day\nConsider sperm cryopreservation\nif oligospermia detected early")
],
[
tdb_c_("6–12 months"),
td("May continue\nAAS/TTh temporarily;\nplan cessation 3–6\nmonths before attempt"),
td("• hCG 500 IU SC every other day\n• ± Clomiphene 25 mg daily\n• Plan AAS cessation 3–6 months\n ahead of fertility attempt"),
td("• Baseline SA immediately\n• Repeat SA every 2–3 months\n• Labs every 6–8 weeks"),
td("Stop AAS earlier if SA worsens\nAdd rFSH if FSH remains low\nUrology referral if azoospermia persists")
],
[
tdb_c_(">12 months"),
td("Continue current\nTTh/AAS if needed"),
td("• hCG 500 IU SC every other day\n (maintains testicular function)\n• Obtain baseline SA now\n to rule out occult infertility"),
td("• Baseline SA\n• Annual review\n• Labs every 3–6 months"),
td("Reassess and intensify protocol\n3–6 months before conception\nattempt is planned")
],
]
story.append(btable(fert_hdrs, fert_rows,
[2.4*cm, 2.6*cm, 5.2*cm, 4.0*cm, 3.0*cm], GREEN, PALE_GRN))
story.append(Spacer(1, 6))
# Timeline of recovery
story.append(p("<b>Expected Timeline of HPG Axis & Spermatogenesis Recovery</b>", h2))
story.append(Spacer(1, 3))
rec_hdrs = [th("Time After AAS Cessation"), th("Expected Hormonal Changes"),
th("Spermatogenesis Status"), th("Clinical Action")]
rec_rows = [
[tdc("0–4 weeks"), td("LH/FSH begin rising\nTestosterone may remain very low\nWithdrawal symptoms peak"), td("Azoospermia expected"), td("Start PCT/HCG immediately\nProvide psychological support\nWatch for depression risk")],
[tdc("4–12 weeks"), td("LH/FSH rising with treatment\nTestosterone reaching 200–400 ng/dL\nOestradiol fluctuating"), td("Still azoospermic or\nsevere oligospermia"), td("Continue current protocol\nAssess compliance\nFirst SA at 8–12 weeks")],
[tdc("3–6 months"), td("T approaching target (≥400 ng/dL)\nLH/FSH normalising\nShBG recovering"), td("Oligospermia (some recovery)\nSperm may appear in ejaculate"), td("Consider cryopreservation\nif any sperm present\nEvaluate response — escalate if needed")],
[tdc("6–12 months"), td("T in normal range (400–700 ng/dL)\nLH/FSH normal in responders"), td("Improving sperm count\nand motility"), td("If count recovering: continue\nIf count not improving: add rFSH\nUrology consultation")],
[tdc("12–24 months"), td("Full hormonal recovery in\nresponders;\nPPAAH defined if still low\nat 6 months"), td("Normal or near-normal SA\nin responders;\nPersistent azoospermia in\nnon-responders"), td("Responders: attempt natural conception\nNon-responders: sperm retrieval\n(TESE/micro-TESE) + ART/ICSI")],
[tdc(">24 months\n(PPAAH)"), td("Persistent hypogonadism\ndespite treatment\n(rare but important subset)"), td("Likely persistent\noligospermia or azoospermia"), td("TRT as definitive therapy\nSperm retrieval if fertility needed\nLifelong endocrinology follow-up")],
]
story.append(btable(rec_hdrs, rec_rows,
[2.8*cm, 4.5*cm, 3.5*cm, 5.4*cm], GREEN, PALE_GRN))
story.append(Spacer(1, 5))
story.append(ok_box(
"Spermatogenesis has a cycle time of approximately 74 days (around 2.5 months). "
"Do not assess treatment failure before 3 full months. Realistic expectation-setting with the "
"patient and partner is essential. 2023 data (Ledesma et al., Fertil Steril) showed that prior "
"AAS use does not necessarily preclude paternity, but treatment and patience are required."))
story.append(Spacer(1, 8))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 6 — POST-CYCLE THERAPY (PCT) PROTOCOLS
# ═══════════════════════════════════════════════════════════════════════════════
story.append(banner("6. POST-CYCLE THERAPY (PCT) PROTOCOLS", PURPLE,
"Structured protocols for HPG axis recovery — for patients WITHOUT immediate fertility intent"))
story.append(Spacer(1, 5))
story.append(info_box(
"<b>Purpose of PCT:</b> PCT aims to accelerate recovery of endogenous testosterone production "
"after AAS cessation, reduce withdrawal symptoms, prevent steroid re-initiation (which a 2023 "
"survey showed PCT reduced by 60%), and restore psychosexual function. PCT protocols vary "
"by AAS cycle length, compounds used, and patient factors.",
PALE_PUR, PURPLE))
story.append(Spacer(1, 5))
# Dr. Scally protocol
story.append(p("<b>A. Dr. Scally's 'Power PCT' Protocol</b> (widely referenced clinical protocol)", h2))
story.append(Spacer(1, 3))
scally = [
["Week 1–4: Phase 1\n(hCG Priming)", "hCG 500–1,500 IU SC 3× weekly",
"'Primes' testicular Leydig cells to respond to gonadotropin stimulation before pituitary-driven LH returns. Start while AAS is still clearing (after long ester washout)."],
["Week 3–4: Transition\n(Overlap Phase)", "Continue hCG at same dose;\nBegin Clomiphene 25 mg daily",
"Overlap ensures testicular function is established before relying on endogenous LH stimulation via SERM."],
["Week 5–16: Phase 2\n(SERM Dominance)", "Clomiphene 25 mg daily (or 50 mg daily ×4 weeks then 25 mg)\nStop hCG at week 5",
"Clomiphene stimulates endogenous LH and FSH. Target T >300–350 ng/dL by week 8–10."],
["Monitoring (throughout)", "T, LH, FSH, E2 every 4–6 weeks;\nHA1c/lipids at baseline and 3 months",
"If T <200 ng/dL by week 8–10 despite clomiphene: add back hCG 500 IU 3× weekly. If E2 excessively elevated: add anastrozole 0.5 mg 2× weekly."],
["Tamoxifen (reserve only)", "10–20 mg daily if gynecomastia develops",
"Do NOT use tamoxifen routinely. Only if symptomatic gynecomastia occurs during PCT. Insufficient evidence for routine HPG recovery benefit."],
]
scally_hdrs = [th("Phase / Timing"), th("Drug & Dose"), th("Rationale & Monitoring Note")]
scally_rows = [[td(a), td(b), td(c)] for a,b,c in scally]
story.append(btable(scally_hdrs, scally_rows, [3.0*cm, 4.0*cm, 9.2*cm], PURPLE, PALE_PUR))
story.append(Spacer(1, 6))
# Short vs long cycle
story.append(p("<b>B. PCT by Cycle Length — When to Start</b>", h2))
story.append(Spacer(1, 3))
start_hdrs = [th("AAS Type / Ester"), th("Half-Life"), th("Washout Before Starting PCT"),
th("PCT Duration")]
start_rows = [
[td("Short esters\n(Testosterone Propionate,\nTrenbolone Acetate, Anavar, Dianabol)"),
tdc("8–36 hours"), tdc("2–4 days after last injection/dose"), tdc("4–6 weeks")],
[td("Medium esters\n(Testosterone Enanthate,\nTestosterone Cypionate)"),
tdc("4–7 days"), tdc("10–14 days after last injection"), tdc("6–8 weeks")],
[td("Long esters\n(Testosterone Undecanoate,\nDeca-Durabolin / Nandrolone Decanoate)"),
tdc("7–21 days"), tdc("3–4 weeks after last injection"), tdc("8–12 weeks")],
[td("Oral 17α-alkylated AAS\n(Dianabol, Anadrol, Anavar)"),
tdc("9–16 hours"), tdc("1–2 days"), tdc("4 weeks minimum")],
[td("Trenbolone Enanthate"),
tdc("7–10 days"), tdc("2–3 weeks"), tdc("6–8 weeks")],
]
story.append(btable(start_hdrs, start_rows,
[4.0*cm, 2.0*cm, 4.5*cm, 3.7*cm], PURPLE, PALE_PUR))
story.append(Spacer(1, 5))
story.append(warn_box(
"These protocols describe the current clinical and evidence-based approach to ASIH management. "
"AAS use (non-prescribed) remains illegal in many jurisdictions. All treatment must be supervised "
"by a licensed physician. SERMs (clomiphene, tamoxifen) and hCG are used off-label in males — "
"obtain informed consent and document the clinical rationale."))
story.append(Spacer(1, 8))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 7 — AAS-RELATED SYSTEMIC COMPLICATIONS
# ═══════════════════════════════════════════════════════════════════════════════
story.append(banner("7. SYSTEMIC COMPLICATIONS OF CHRONIC AAS USE", DARK_RED,
"Concurrent organ-system assessment required — Harrison's 22E (2025)"))
story.append(Spacer(1, 5))
comp_hdrs = [th("System"), th("Complication"), th("Mechanism"), th("Assessment"), th("Management")]
comp_rows = [
[td("<b>Cardiovascular</b>"), td("LV hypertrophy, diastolic dysfunction, myocardial fibrosis, arrhythmias (↑ QT dispersion), ↑ coronary plaque, dilated cardiomyopathy"), td("Direct androgenic myocardial hypertrophy; ↑ ROS; ↓ HDL, ↑ LDL; nitric oxide impairment"), td("ECG, echo, lipid panel, troponin, coronary CT angiography if indicated"), td("Cessation of AAS; statin if dyslipidaemia; cardiology referral; ACE-I/ARB for LV dysfunction")],
[td("<b>Hepatic</b>"), td("Hepatocellular carcinoma, peliosis hepatis, cholestasis, elevated transaminases"), td("17α-alkylated oral AAS most hepatotoxic; direct hepatocellular toxicity"), td("LFTs, GGT, bilirubin; liver ultrasound; AFP if indicated"), td("Cease oral AAS; avoid alcohol; monitor LFTs — most resolve with cessation")],
[td("<b>Haematological</b>"), td("Polycythaemia (↑ Hct), thrombotic events (DVT, PE, stroke)"), td("↑ Erythropoiesis via androgen stimulation of EPO; ↑ platelet aggregation"), td("FBC: Hct target <54%; coagulation profile"), td("Therapeutic phlebotomy; dose adjustment or cessation; anticoagulation if thrombosis")],
[td("<b>Renal</b>"), td("Focal segmental glomerulosclerosis (FSGS), acute kidney injury (AKI) from rhabdomyolysis"), td("↑ muscle mass → ↑ creatinine burden; direct glomerular toxicity"), td("eGFR, creatinine, urinalysis, renal biopsy if FSGS suspected"), td("Cease AAS; nephrology referral; RAAS inhibitors for FSGS; hydration for rhabdomyolysis")],
[td("<b>Neuropsychiatric</b>"), td("Major depression (withdrawal), mania/hypomania (on-cycle), aggression, addiction, suicidality, cognitive impairment, structural brain changes"), td("HPG disruption affects limbic circuits; direct androgenic CNS effects; dopaminergic/serotonergic dysregulation"), td("Psychiatric screening (PHQ-9, MDQ); MRI brain if cognitive decline; addiction assessment"), td("Psychiatry referral; antidepressants for withdrawal depression; CBT for body dysmorphia (muscle dysmorphia); addiction medicine")],
[td("<b>Dermatological</b>"), td("Severe cystic acne, androgenic alopecia, striae, skin infections at injection sites"), td("↑ sebaceous gland activity; DHT-mediated hair follicle miniaturisation"), td("Clinical examination; dermatology referral for severe acne"), td("Isotretinoin for severe acne; finasteride for AGA (note: further reduces DHT — monitor); wound care for injection sites")],
[td("<b>Infectious</b>"), td("HIV, Hepatitis B/C (if injecting), MRSA at injection sites"), td("Unsafe injecting practices; shared needles; high-risk sexual behaviour"), td("HIV, HBsAg, HCV Ab, VDRL; vaccination status"), td("Harm reduction counselling; needle exchange programme referral; appropriate antiviral therapy; vaccination (HBV)")],
[td("<b>Endocrine\n(Other)</b>"), td("Insulin resistance, impaired glucose tolerance; thyroid suppression; adrenal effects"), td("Direct androgenic effects on insulin signalling; HPG-adrenal interactions"), td("HbA1c, fasting glucose, thyroid function tests"), td("Lifestyle intervention; metformin if glucose impaired; endocrine review")],
]
story.append(btable(comp_hdrs, comp_rows,
[2.2*cm, 3.2*cm, 3.0*cm, 3.0*cm, 4.8*cm], DARK_RED, PALE_RED))
story.append(Spacer(1, 8))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 8 — MONITORING TABLE
# ═══════════════════════════════════════════════════════════════════════════════
story.append(banner("8. MONITORING SCHEDULE — DURING TREATMENT", STEEL,
"Recommended surveillance intervals for ASIH patients on recovery therapy"))
story.append(Spacer(1, 5))
mon_hdrs = [th("Parameter"), th("Baseline\n(Pre-Treatment)"), th("Monthly\n(1–3)"),
th("Every 3 Months\n(3–12)"), th("Every 6 Months\n(>12 mos)"), th("Target / Notes")]
mon_rows = [
[td("Total Testosterone"), tdc("✔"), tdc("✔"), tdc("✔"), tdc("✔"), td("Target ≥ 400 ng/dL (ideally 400–700)")],
[td("Free Testosterone"), tdc("✔"), tdc("—"), tdc("✔"), tdc("✔"), td("Especially if SHBG abnormal")],
[td("LH"), tdc("✔"), tdc("✔"), tdc("✔"), tdc("✔"), td("Rising LH = HPG axis recovering")],
[td("FSH"), tdc("✔"), tdc("✔"), tdc("✔"), tdc("✔"), td("FSH rise precedes sperm recovery")],
[td("Oestradiol (E2)"), tdc("✔"), tdc("✔"), tdc("✔"), tdc("✔"), td("Target 20–30 pg/mL; >50 = consider AI")],
[td("SHBG"), tdc("✔"), tdc("—"), tdc("✔"), tdc("✔"), td("Normalisation confirms axis recovery")],
[td("Semen Analysis"), tdc("✔"), tdc("—"), tdc("✔"), tdc("✔"), td("WHO criteria; every 2–3 months if azoospermic")],
[td("Full Blood Count (Hct)"),tdc("✔"), tdc("✔"), tdc("✔"), tdc("✔"), td("Hct < 54%; phlebotomy if ↑")],
[td("Lipids"), tdc("✔"), tdc("—"), tdc("✔"), tdc("✔"), td("Statin if LDL >130 mg/dL")],
[td("LFTs"), tdc("✔"), tdc("✔"), tdc("✔"), tdc("—"), td("Normalise after oral AAS cessation")],
[td("Fasting Glucose/HbA1c"), tdc("✔"), tdc("—"), tdc("✔"), tdc("✔"), td("OGTT if impaired fasting glucose")],
[td("PSA (age >40)"), tdc("✔"), tdc("—"), tdc("—"), tdc("✔"), td("Baseline and annual; urology if rising")],
[td("ECG + Echo"), tdc("✔"), tdc("—"), tdc("—"), tdc("✔"), td("LVEF, diastolic function; cardiology PRN")],
[td("DEXA Scan\n(if >2yr use)"), tdc("✔"), tdc("—"), tdc("—"), tdc("Annual"), td("Bone loss from prolonged hypogonadism")],
[td("Psychiatric Assessment"), tdc("✔"), tdc("✔"), tdc("✔"), tdc("✔"), td("PHQ-9 for depression; suicidality screen")],
[td("HIV / Hepatitis B, C"), tdc("✔"), tdc("—"), tdc("—"), tdc("Annual"), td("If injector; vaccination status")],
]
story.append(btable(mon_hdrs, mon_rows,
[3.5*cm, 2.0*cm, 1.8*cm, 2.2*cm, 2.2*cm, 4.5*cm], STEEL, PALE_BLUE))
story.append(Spacer(1, 8))
# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 9 — WHEN TO REFER
# ═══════════════════════════════════════════════════════════════════════════════
story.append(banner("9. REFERRAL PATHWAYS & SPECIAL SITUATIONS", SLATE))
story.append(Spacer(1, 5))
ref_hdrs = [th("Situation"), th("Refer To"), th("Rationale")]
ref_rows = [
[td("Persistent azoospermia ≥12 months on maximal medical therapy"), td("Urology / Andrology (Male Fertility Specialist)"), td("Surgical sperm retrieval (TESE / micro-TESE) + ICSI/ART consideration")],
[td("LH/FSH fail to rise after 3 months of SERM therapy"), td("Reproductive Endocrinology"), td("Deep pituitary suppression; may need combined hCG + rFSH protocol")],
[td("ECG changes, LV dysfunction, arrhythmia, or chest pain"), td("Cardiology"), td("AAS-induced cardiomyopathy; arrhythmia risk assessment")],
[td("LFTs persistently elevated or liver lesion on imaging"), td("Gastroenterology / Hepatology"), td("Peliosis hepatis, hepatocellular carcinoma risk")],
[td("Haematocrit persistently >54% despite cessation"), td("Haematology"), td("Polycythaemia vera vs secondary polycythaemia; thrombosis risk")],
[td("Major depression, suicidality, mania, psychosis, or addiction"), td("Psychiatry / Addiction Medicine"), td("AAS withdrawal depression is serious; body dysmorphia (muscle dysmorphia) treatment required")],
[td("Renal impairment (↑ creatinine, proteinuria)"), td("Nephrology"), td("FSGS associated with AAS; requires biopsy and RAAS inhibition")],
[td("Unable to conceive after 12 months of treatment + adequate SA"), td("Reproductive Medicine / IVF Clinic"), td("IUI, IVF-ICSI using retrieved or ejaculated sperm")],
[td("PPAAH diagnosed (hypogonadism persisting >6 months post-cessation)"), td("Endocrinology"), td("Long-term TRT decision; bone density management; complex hormonal interplay")],
]
story.append(btable(ref_hdrs, ref_rows, [5.0*cm, 4.0*cm, 7.2*cm], SLATE, LGREY))
story.append(Spacer(1, 8))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 10 — KEY EVIDENCE SUMMARY
# ═══════════════════════════════════════════════════════════════════════════════
story.append(banner("10. KEY EVIDENCE SUMMARY & REFERENCES", NAVY))
story.append(Spacer(1, 5))
ev_hdrs = [th("Study / Source"), th("Year"), th("Design"), th("Key Finding"), th("PMID / DOI")]
ev_rows = [
[td("Vilar Neto et al."), tdc("2021"), td("Systematic Review\n(179 ASIH cases)"), td("Full HPG recovery in only 4/38 well-documented cases; ASIH is seriously underestimated and often irreversible without treatment"), tdc("33887077")],
[td("Pope & Kanayama\n(Endocrinol Metab Clin N Am)"), tdc("2022"), td("Narrative Review"), td("ASIH may persist for months to years; hCG + clomiphene the mainstay of treatment; many endocrinologists have limited experience with this condition"), tdc("35216717")],
[td("van Os, Smit, Bond,\nde Ronde (Front Endocrinol)"), tdc("2025"), td("Review +\nProposed Diagnostic\nFramework"), td("Proposed 'PPAAH' definition: hypogonadism persisting 6+ months after cessation, with ≥150 mg/week AAS for ≥6 months. Standardises diagnosis for research and clinical use."), tdc("40678315")],
[td("Henriksen et al.\n(CloTASH pilot study)"), tdc("2024"), td("Pilot RCT\n(off-label clomiphene\nin ASIH males)"), td("Clomiphene ± hCG significantly improved T levels and HPG axis recovery in ASIH patients; supports off-label clinical use"), td("MethodsX 2024;\n102810")],
[td("Grant et al.\n(Subst Abuse Treat Prev Policy)"), tdc("2023"), td("Survey study\n(470 men)"), td("PCT use was associated with 60% reduced steroid withdrawal symptoms and reduced urge to restart AAS; supports PCT as harm-reduction strategy"), td("2023 survey")],
[td("Ledesma et al.\n(Fertil Steril)"), tdc("2023"), td("Retrospective\ncohort"), td("Prior AAS use does not preclude paternity; with appropriate treatment, fertility outcomes are achievable in many men"), td("Fertil Steril\n2023;120:1203")],
[td("World J Mens Health\n(Fertility Management Protocol)"), tdc("2020"), td("Expert\nProtocol/Review"), td("Definitive fertility protocol: 3,000 IU hCG EOD + clomiphene 25–50 mg daily for <6 month fertility goal; rFSH 75 IU EOD added if FSH fails to rise"), td("WJMH 2020;\n10.5534/wjmh.190002")],
[td("Harrison's Principles of\nInternal Medicine 22E"), tdc("2025"), td("Textbook\n(McGraw-Hill)"), td("Up to 25% of young men at men's health clinics have AAS withdrawal hypogonadism; 30% develop AAS dependence; HPT suppression may last >1 year; some cases may be partially irreversible"), td("Harrison's 22E\nMcGraw-Hill 2025")],
[td("Rahnema et al.\n(Fertil Steril — Classic ref)"), tdc("2014"), td("Review + Expert\nConsensus"), td("Foundational paper defining ASIH management: judicious TRT, hCG, and SERMs are the management triad; specific AAS cycle details guide treatment"), td("24636400")],
]
story.append(btable(ev_hdrs, ev_rows, [3.0*cm, 1.4*cm, 2.8*cm, 6.2*cm, 2.8*cm], NAVY, PALE_BLUE))
story.append(Spacer(1, 8))
# ── DISCLAIMER ────────────────────────────────────────────────────────────────
story.append(hr(DARK_RED, 1.2))
disc = (
"<b>DISCLAIMER:</b> This clinical reference guide is intended for use by licensed medical "
"professionals in a supervised clinical setting. Information is based on published medical "
"literature, systematic reviews, and expert clinical guidelines current as of June 2026. "
"All drug doses are off-label in males unless otherwise specified and require documented "
"informed consent. AAS use without prescription is illegal in many jurisdictions. "
"This document does not constitute legal or regulatory advice. The management of ASIH "
"requires individualised clinical assessment by a qualified physician — endocrinologist, "
"urologist, or reproductive specialist as appropriate. Emergency presentations (severe "
"depression, suicidality, acute cardiac events) require immediate specialist care."
)
story.append(Paragraph(disc, note))
doc.build(story, onFirstPage=on_page, onLaterPages=on_page)
print(f"SUCCESS: {OUTPUT}")
cd /home/daytona/workspace/homoeopathy-pdf && python3 generate_asih_pdf.py 2>&1
cd /home/daytona/workspace/homoeopathy-pdf && sed -i 's/"<b>Wants fertility now\\n(< 6 months)"/"<b>Wants fertility now (under 6 months)<\/b>"/g' generate_asih_pdf.py && python3 -c " import re, sys with open('generate_asih_pdf.py','r') as f: content=f.read() # Fix all < signs inside paragraph strings that arent html tags # Replace < followed by a digit/space (not an html tag) with < content = content.replace('(< 6 months)', '(<6 months)') content = content.replace('(< 54%)', '(<54%)') content = content.replace('< 200 ng/dL', '<200 ng/dL') content = content.replace('< 54%', '<54%') content = content.replace('< 4.0', '<4.0') content = content.replace('< 15 ng', '<15 ng') content = content.replace('< 130', '<130') content = content.replace('(<6 months)', '(<6 months)') content = content.replace('>1 year', '>1 year') content = content.replace('> a year', '>a year') with open('generate_asih_pdf.py','w') as f: f.write(content) print('fixed') "
python3 << 'PYEOF' with open('/home/daytona/workspace/homoeopathy-pdf/generate_asih_pdf.py','r') as f: content = f.read() replacements = [ ('(< 6 months)', '(<6 months)'), ('<6 months', '<6 months'), ('< 54%', '<54%'), ('< 200 ng/dL', '<200 ng/dL'), ('< 4.0 ng/mL', '<4.0 ng/mL'), ('< 15 ng/mL', '<15 ng/mL'), ('< 130', '<130'), ('<6 month', '<6 month'), ('<b>Wants fertility now\n(< 6 months)', '<b>Wants fertility now (<6 months)</b>'), # Fix bold tags not closed before newline in td cells ] for old, new in replacements: content = content.replace(old, new) # Fix the specific line with unclosed <b> before newline content = content.replace( 'td("<b>Wants fertility now\n(< 6 months)")', 'td("<b>Wants fertility now (<6 months)</b>")' ) content = content.replace( 'tdb_c_("<6 months\n(URGENT)")', 'tdb_c_("<6 months\\n(URGENT)")' ) with open('/home/daytona/workspace/homoeopathy-pdf/generate_asih_pdf.py','w') as f: f.write(content) print('done') PYEOF
cd /home/daytona/workspace/homoeopathy-pdf && python3 generate_asih_pdf.py 2>&1
python3 << 'PYEOF' with open('/home/daytona/workspace/homoeopathy-pdf/generate_asih_pdf.py','r') as f: content = f.read() # The problem is <b>text\nmoretext" -- the \n breaks the bold tag parsing. # ReportLab requires <b> to be closed before any newline in plain strings. # Fix: close bold tags before \n, reopen after -- or just use <br/> instead. # Strategy: replace \n inside td() strings with <br/> import re # Find all td("...") and tdb_c_("...") calls and replace \n with <br/> def fix_newlines_in_td(text): # Replace \n within quoted strings that are arguments to td(), tdb_c_(), tdb(), tdc() result = [] i = 0 while i < len(text): # Look for td(" or tdb(" etc m = re.match(r'(td|tdb|tdc|tdb_c_)\("', text[i:]) if m: func_start = i # Find the matching closing quote (handle escaped quotes) j = i + len(m.group(0)) string_chars = [] while j < len(text): if text[j] == '\\' and j+1 < len(text): if text[j+1] == 'n': string_chars.append('<br/>') j += 2 continue else: string_chars.append(text[j]) string_chars.append(text[j+1]) j += 2 continue if text[j] == '"': break string_chars.append(text[j]) j += 1 # Now fix unclosed bold tags spanning line breaks segment = ''.join(string_chars) # Ensure <b> is closed before <br/> segment = segment.replace('<b>', '<b>').replace('</b>', '</b>') # If <b> appears without </b> before a <br/>, add </b> before <br/> and <b> after parts = segment.split('<br/>') fixed_parts = [] open_b = False for part in parts: if '<b>' in part and '</b>' not in part: part = part + '</b>' open_b = True fixed_parts.append(part) elif open_b and '</b>' not in part: fixed_parts.append('<b>' + part) else: open_b = False fixed_parts.append(part) segment = '<br/>'.join(fixed_parts) result.append(text[func_start:func_start+len(m.group(0))]) result.append(segment) result.append('"') i = j + 1 else: result.append(text[i]) i += 1 return ''.join(result) content = fix_newlines_in_td(content) with open('/home/daytona/workspace/homoeopathy-pdf/generate_asih_pdf.py','w') as f: f.write(content) print('done - newlines fixed') PYEOF
cd /home/daytona/workspace/homoeopathy-pdf && python3 generate_asih_pdf.py 2>&1
python3 << 'PYEOF' with open('/home/daytona/workspace/homoeopathy-pdf/generate_asih_pdf.py','r') as f: content = f.read() # Fix all remaining unclosed <b> tags before end of string # Pattern: <b>text without </b> at end import re def fix_unclosed_b(s): """Ensure all <b> tags are properly closed.""" # Count opening vs closing b tags opens = s.count('<b>') closes = s.count('</b>') while closes < opens: # Find the last <b> without a matching </b> after it last_b = s.rfind('<b>') # Add </b> at end s = s + '</b>' closes += 1 return s # Process all string arguments in td(), tdc(), tdb(), tdb_c_() calls # More targeted: just find and fix the specific lines causing issues lines = content.split('\n') fixed_lines = [] for line in lines: # Check if line contains td/tdb/tdc with unclosed <b> if ('td("' in line or 'tdb(' in line or 'tdc(' in line or 'tdb_c_(' in line): # Find strings with <b> but missing </b> line = re.sub(r'<b>([^<]*)<br/><b>', r'<b>\1</b><br/><b>', line) # Fix pattern: <b>xxx</b><br/><b>(yyy) -- close the reopened b line = re.sub(r'<b>(\([^)]*\))"', r'<b>\1</b>"', line) # Fix: if line has more <b> than </b> inside quotes def fix_string(m): s = m.group(0) opens = s.count('<b>') closes = s.count('</b>') if opens > closes: s = s[:-1] + '</b>"' # add </b> before closing quote return s line = re.sub(r'"[^"]*"', fix_string, line) fixed_lines.append(line) content = '\n'.join(fixed_lines) with open('/home/daytona/workspace/homoeopathy-pdf/generate_asih_pdf.py','w') as f: f.write(content) print('fixed') PYEOF
cd /home/daytona/workspace/homoeopathy-pdf && python3 generate_asih_pdf.py 2>&1 | head -30
python3 << 'PYEOF' with open('/home/daytona/workspace/homoeopathy-pdf/generate_asih_pdf.py','r') as f: content = f.read() # Find all bad patterns and fix them directly import re def fix_td_html(content): """Find td/tdb/tdc calls and fix their HTML.""" # Pattern to find function calls with string args # We'll process the decision table rows specifically # Fix 1: extra </b> added by regex content = content.replace('No fertility intent;</b><br/>symptomatic ASIH</b>', 'No fertility intent;<br/>symptomatic ASIH') content = content.replace('<b>Wants fertility now</b><br/><b>(<6 months)</b>', '<b>Wants fertility now (<6 months)</b>') content = content.replace('<b>Wants fertility in 6-12 months</b>', '<b>Wants fertility in 6-12 months</b>') content = content.replace('PPAAH</b><br/><b>(>=6 months post-cessation,</b><br/><b>still hypogonadal)', 'PPAAH<br/>(>=6 months post-cessation,<br/>still hypogonadal)') # Fix all remaining malformed <b> patterns: <b>xxx</b><br/><b>yyy</b> # These are fine actually -- but we need to ensure the last part is closed # The issue is strings like: <b>text</b><br/><b>(text) -- missing final </b> # General fix: scan strings in td() for unclosed tags def fix_html_string(s): # Remove all closing b tags that have no matching open import html.parser # Simple approach: ensure equal number of <b> and </b> opens = s.count('<b>') closes = s.count('</b>') if opens > closes: # Add missing </b> at the end s = s + '</b>' * (opens - closes) elif closes > opens: # Remove extra </b> from end for _ in range(closes - opens): last = s.rfind('</b>') if last >= 0: s = s[:last] + s[last+4:] return s # Process each td/tdb/tdc/tdb_c_ string argument def process_match(m): func = m.group(1) quote_char = m.group(2) string_content = m.group(3) fixed = fix_html_string(string_content) return f'{func}({quote_char}{fixed}{quote_char}' # Match td("...") patterns (single line strings only, no escaped quotes inside) # Use a careful pattern pattern = r'(td|tdb|tdc|tdb_c_)\(("[^"]*")' def fixer(m): full = m.group(0) func = m.group(1) quoted = m.group(2) inner = quoted[1:-1] # strip quotes fixed = fix_html_string(inner) return f'{func}("{fixed}"' content = re.sub(pattern, fixer, content) return content content = fix_td_html(content) with open('/home/daytona/workspace/homoeopathy-pdf/generate_asih_pdf.py','w') as f: f.write(content) print('HTML tags fixed') PYEOF
cd /home/daytona/workspace/homoeopathy-pdf && python3 generate_asih_pdf.py 2>&1
~/homoeopathy-pdf/generate_asih_pdf.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/homoeopathy-pdf/generate_asih_pdf.py'
cd /home/daytona/workspace/homoeopathy-pdf && python3 generate_asih_pdf.py 2>&1
python3 -c " from pypdf import PdfReader import os r = PdfReader('/home/daytona/workspace/homoeopathy-pdf/ASIH_Management_Fertility_Guide.pdf') sz = os.path.getsize('/home/daytona/workspace/homoeopathy-pdf/ASIH_Management_Fertility_Guide.pdf') print(f'Pages: {len(r.pages)} | Size: {sz/1024:.1f} KB') for i, pg in enumerate(r.pages): txt = pg.extract_text()[:90].replace(chr(10),' ') print(f' p{i+1}: {txt}') "
ASIH Management Fertility Guide
PDF Document · PDF
| Page(s) | Section | Key Content |
|---|---|---|
| 1 | Cover + Epidemiology | Title page; Harrison's 22E 2025 stats — 25% of young men in TRT clinics have ASIH; 30% develop dependence |
| 2 | Pathophysiology | HPG axis suppression table: Hypothalamus → Pituitary → Leydig cells → Sertoli cells → SHBG → Oestradiol feedback; definition of PPAAH (van Os et al. 2025) |
| 3 | Clinical Features & Diagnosis | Symptom/examination two-column layout; Full 15-row diagnostic laboratory panel with normal ranges and clinical significance (Testosterone, LH, FSH, E2, SHBG, Prolactin, Semen Analysis, Ultrasound, FBC, Lipids, LFTs, HbA1c, PSA, DEXA) |
| 4 | Treatment Decision Pathway | 5-row decision table by patient profile: wants fertility now / in 6–12 months / >12 months / no fertility intent / PPAAH |
| 5–7 | Pharmacological Agents (6 drugs) | Each drug has: Mechanism of Action, Male Dosing, Duration, Monitoring targets, Adverse Effects, Clinical Notes — covers hCG, Clomiphene, Tamoxifen, rFSH, Aromatase Inhibitors, TRT |
| 8 | Fertility Restoration Protocol | WJMH 2020 protocol table by time horizon (<6 months, 6–12 months, >12 months); Expected HPG recovery timeline (0–4 weeks through >24 months) with spermatogenesis status and actions |
| 9–10 | Post-Cycle Therapy Protocols | Dr. Scally's Power PCT (Phase 1 hCG → Phase 2 SERM); PCT timing by AAS ester type and half-life |
| 11 | Systemic Complications | 8-system complications table: Cardiovascular, Hepatic, Haematological, Renal, Neuropsychiatric, Dermatological, Infectious, Endocrine — each with mechanism, assessment, and management |
| 12 | Monitoring Schedule | 16-parameter monitoring table with frequency columns: baseline, monthly, every 3 months, every 6 months, and targets |
| 13 | Referral Pathways + Evidence Summary | 9 referral indications; 9-study evidence table with PMIDs (Harrison's 22E, Vilar Neto 2021, Pope/Kanayama 2022, van Os 2025, Henriksen CloTASH 2024, Grant 2023, Ledesma 2023, WJMH 2020, Rahnema 2014) |
Diagnosis
| Test | Patient Result | Normal Adult Range | Status |
|---|---|---|---|
| T3 (Tri-iodothyronine) | 1.19 ng/mL | 0.8–2.0 ng/mL | ✅ Normal |
| T4 (Thyroxine) | 12.73 µg/dL | 5.0–12.0 µg/dL | ⚠️ Slightly elevated |
| TSH | 0.02 µIU/mL (underlined) | 0.4–4.5 µIU/mL | 🔴 Critically suppressed |
| Diagnosis | Likelihood | Distinguishing Features |
|---|---|---|
| Graves' Disease | Most likely | Most common cause in women aged 20–50; diffuse goitre, TSH suppressed to near-zero, may have TSI antibodies, eye signs (exophthalmos), pretibial myxedema |
| Toxic Multinodular Goitre (MNG) | Possible | Older patients, nodular thyroid on palpation/USS |
| Toxic Adenoma (Single hot nodule) | Possible | Single palpable nodule, older age group |
| Thyroiditis (subacute/silent) | Less likely | Self-limiting, painful or painless, post-viral or post-partum |
| Exogenous thyroid hormone | Consider | If on any thyroid medication |
| Approach | Drug / Method | Notes |
|---|---|---|
| Anti-thyroid drugs (ATDs) | Carbimazole 10–40 mg/day or Methimazole; or Propylthiouracil (PTU) | First-line in most patients; block thyroid hormone synthesis |
| Beta-blocker (symptom relief) | Propranolol 40 mg TDS or Atenolol 50 mg OD | Controls palpitations, tremor, anxiety while awaiting euthyroid state |
| Radioiodine (I-131) | Definitive treatment option | Preferred in older/recurrent patients; causes hypothyroidism long-term |
| Thyroidectomy | Surgery | If large goitre, malignancy suspected, or ATD failure |
Mrs Kuni Muduli, 40F has biochemically confirmed hyperthyroidism with a critically suppressed TSH (0.02 µIU/mL) and borderline elevated T4 (12.73 µg/dL). The most likely diagnosis is Graves' disease. Urgent endocrinology referral is recommended. Further tests (FT4, FT3, TRAb, thyroid USS) are needed before initiating definitive treatment.
Create a detailed PDF guide on Graves' disease — diagnosis, pathophysiology, treatment options, and complications
"Graves disease" AND "management" AND "guidelines"
PMID: 37847271
PMID: 39787151
~/homoeopathy-pdf/generate_graves_pdf.py
#!/usr/bin/env python3
"""
Graves' Disease — Comprehensive Clinical PDF Guide
Sources: Harrison's 22E (2025), JAMA 2023, J Clin Endocrinol Metab 2025,
Tietz Lab Medicine 7e, Sabiston Surgery
"""
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import cm
from reportlab.lib.styles import ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY, TA_RIGHT
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, KeepTogether, PageBreak
)
from reportlab.lib.colors import HexColor
OUTPUT = "/home/daytona/workspace/homoeopathy-pdf/Graves_Disease_Clinical_Guide.pdf"
W, H = A4
LM, RM, TM, BM = 1.8*cm, 1.8*cm, 1.8*cm, 1.8*cm
BW = W - LM - RM
# Palette — teal/indigo medical theme
INDIGO = HexColor("#2C3E7A")
ROYAL = HexColor("#3A5FC5")
PALE_BLUE = HexColor("#E8EEF9")
TEAL = HexColor("#0D6B6B")
PALE_TEAL = HexColor("#E0F4F4")
CYAN_D = HexColor("#006B82")
PALE_CYAN = HexColor("#E0F7FA")
RED_D = HexColor("#8B1A1A")
PALE_RED = HexColor("#FFF0F0")
ORANGE = HexColor("#C45E00")
PALE_ORG = HexColor("#FFF4E6")
GREEN = HexColor("#1B6B2E")
PALE_GRN = HexColor("#EBF7EE")
PURPLE = HexColor("#5A2D8D")
PALE_PUR = HexColor("#F4EEFF")
AMBER = HexColor("#8B6914")
PALE_AMB = HexColor("#FFFDE7")
SLATE = HexColor("#37474F")
LGREY = HexColor("#F4F6F8")
MGREY = HexColor("#90A4AE")
DGREY = HexColor("#546E7A")
WHITE = colors.white
BLACK = colors.black
def S(name, **kw): return ParagraphStyle(name, **kw)
base = S('base', fontName='Helvetica', fontSize=8.5, leading=12, textColor=BLACK)
bodyj = S('bj', parent=base, alignment=TA_JUSTIFY, spaceAfter=3)
body = S('bl', parent=base, spaceAfter=2)
note = S('nt', parent=base, fontSize=7, leading=9.5, textColor=SLATE, fontName='Helvetica-Oblique')
h2 = S('h2', parent=base, fontSize=9.5, fontName='Helvetica-Bold', textColor=INDIGO, spaceBefore=4, spaceAfter=3)
th_s = S('th', parent=base, fontSize=8, fontName='Helvetica-Bold', textColor=WHITE, alignment=TA_CENTER)
td_s = S('td', parent=base, fontSize=8, leading=11)
tdc_s = S('tdc', parent=base, fontSize=8, leading=11, alignment=TA_CENTER)
tdb_s = S('tdb', parent=base, fontSize=8, leading=11, fontName='Helvetica-Bold')
tdb_c = S('tdbc', parent=base, fontSize=8, leading=11, fontName='Helvetica-Bold', alignment=TA_CENTER)
banner_s = S('ban', parent=base, fontSize=10, fontName='Helvetica-Bold', textColor=WHITE)
cover_t = S('ct', parent=base, fontSize=26, fontName='Helvetica-Bold', textColor=WHITE, alignment=TA_CENTER)
cover_s = S('cs', parent=base, fontSize=12, fontName='Helvetica-Bold', textColor=HexColor("#FFD700"), alignment=TA_CENTER)
cover_n = S('cn', parent=base, fontSize=8, textColor=HexColor("#90CAF9"), alignment=TA_CENTER, fontName='Helvetica-Oblique')
def p(t, st=body): return Paragraph(t, st)
def th(t): return Paragraph(t, th_s)
def td(t): return Paragraph(t, td_s)
def tdc(t): return Paragraph(t, tdc_s)
def tdb(t): return Paragraph(t, tdb_s)
def hr(c=TEAL): return HRFlowable(width="100%", thickness=0.5, color=c, spaceAfter=3, spaceBefore=3)
def banner(text, fg=INDIGO, sub=None):
rows = [[Paragraph(text, banner_s)]]
if sub:
rows.append([Paragraph(sub, S('bs', parent=base, fontSize=7.5, textColor=HexColor("#A8C8F0")))])
t = Table(rows, colWidths=[BW])
t.setStyle(TableStyle([
('BACKGROUND', (0,0),(-1,-1), fg),
('LEFTPADDING',(0,0),(-1,-1), 10),
('TOPPADDING', (0,0),(-1,-1), 6),
('BOTTOMPADDING',(0,0),(-1,-1), 6),
]))
return t
def box(text, bg=PALE_BLUE, border=ROYAL, style=None):
st = style or bodyj
t = Table([[Paragraph(text, st)]], colWidths=[BW])
t.setStyle(TableStyle([
('BACKGROUND',(0,0),(-1,-1), bg),
('BOX',(0,0),(-1,-1), 0.8, border),
('LEFTPADDING',(0,0),(-1,-1), 10),
('RIGHTPADDING',(0,0),(-1,-1), 10),
('TOPPADDING',(0,0),(-1,-1), 7),
('BOTTOMPADDING',(0,0),(-1,-1), 7),
]))
return t
def two_col(left_text, right_text, bg1=PALE_BLUE, bg2=PALE_TEAL):
t = Table([[Paragraph(left_text, td_s), Paragraph(right_text, td_s)]], colWidths=[BW/2, BW/2])
t.setStyle(TableStyle([
('BACKGROUND',(0,0),(0,0), bg1),
('BACKGROUND',(1,0),(1,0), bg2),
('BOX',(0,0),(-1,-1), 0.4, MGREY),
('INNERGRID',(0,0),(-1,-1), 0.4, MGREY),
('VALIGN',(0,0),(-1,-1),'TOP'),
('TOPPADDING',(0,0),(-1,-1), 7),
('BOTTOMPADDING',(0,0),(-1,-1), 7),
('LEFTPADDING',(0,0),(-1,-1), 9),
('RIGHTPADDING',(0,0),(-1,-1), 9),
]))
return t
def btable(hdrs, rows, cols, hc=INDIGO, rb1=PALE_BLUE, rb2=WHITE):
data = [hdrs] + rows
t = Table(data, colWidths=cols, hAlign='LEFT')
t.setStyle(TableStyle([
('BACKGROUND',(0,0),(-1,0), hc),
('ROWBACKGROUNDS',(0,1),(-1,-1),[rb1, rb2]),
('GRID',(0,0),(-1,-1), 0.35, MGREY),
('VALIGN',(0,0),(-1,-1),'TOP'),
('TOPPADDING',(0,0),(-1,-1), 4),
('BOTTOMPADDING',(0,0),(-1,-1), 4),
('LEFTPADDING',(0,0),(-1,-1), 5),
('RIGHTPADDING',(0,0),(-1,-1), 5),
]))
return t
pn = [0]
def on_page(c, doc):
pn[0] += 1
c.saveState()
c.setFillColor(INDIGO)
c.rect(LM, BM-13, BW, 13, fill=1, stroke=0)
c.setFillColor(WHITE)
c.setFont('Helvetica', 7)
c.drawString(LM+5, BM-10, "Graves' Disease — Comprehensive Clinical Guide | Harrison's 22E 2025 / JAMA 2023")
c.drawRightString(LM+BW-5, BM-10, f"Page {pn[0]}")
c.setFillColor(HexColor("#FFD700"))
c.rect(LM, H-TM+2, BW, 3, fill=1, stroke=0)
c.restoreState()
doc = SimpleDocTemplate(OUTPUT, pagesize=A4,
topMargin=TM+4, bottomMargin=BM+16,
leftMargin=LM, rightMargin=RM,
title="Graves' Disease — Comprehensive Clinical Guide",
author="Harrison's 22E 2025 / JAMA 2023",
subject="Graves Disease Diagnosis Treatment Pathophysiology Complications")
story = []
# ═══════════════════════════════════════════
# COVER
# ═══════════════════════════════════════════
cov = Table([
[Paragraph("GRAVES' DISEASE", cover_t)],
[Spacer(1,6)],
[Paragraph("Comprehensive Clinical Guide", cover_s)],
[Paragraph("Pathophysiology • Diagnosis • Treatment • Complications • Special Populations",
S('csu', parent=base, fontSize=9, textColor=HexColor("#A8C8F0"), alignment=TA_CENTER))],
[Spacer(1,8)],
[Paragraph("The most common cause of hyperthyroidism worldwide — affecting 2% of women and 0.5% of men",
S('cq', parent=base, fontSize=9, fontName='Helvetica-Oblique',
textColor=HexColor("#FFE082"), alignment=TA_CENTER))],
[Spacer(1,8)],
[Paragraph(
"Sources: Harrison's Principles of Internal Medicine 22E (McGraw-Hill, 2025) • "
"Lee & Pearce, JAMA 2023 (PMID 37847271) • Bartalena & Smith, J Clin Endocrinol Metab 2025 (PMID 39787151) • "
"Tietz Textbook of Laboratory Medicine 7e • Sabiston Textbook of Surgery • "
"ATA Guidelines 2016/2026",
cover_n)],
], colWidths=[BW])
cov.setStyle(TableStyle([
('BACKGROUND',(0,0),(-1,-1), INDIGO),
('TOPPADDING',(0,0),(-1,-1), 9),
('BOTTOMPADDING',(0,0),(-1,-1), 9),
('LEFTPADDING',(0,0),(-1,-1), 18),
('RIGHTPADDING',(0,0),(-1,-1), 18),
]))
story.append(cov)
story.append(Spacer(1,8))
story.append(box(
"<b>Clinical Snapshot:</b> Graves' disease is an autoimmune disorder in which thyroid-stimulating "
"immunoglobulins (TSI/TRAb) activate TSH receptors on thyroid follicular cells, causing unregulated "
"thyroid hormone overproduction. It is responsible for ~70-80% of all cases of hyperthyroidism. "
"The classic triad is <b>thyrotoxicosis + diffuse goitre + ophthalmopathy</b>. It affects women "
"5-10 times more than men, with peak onset in the 3rd-5th decades.",
PALE_BLUE, ROYAL))
story.append(Spacer(1,8))
# ═══════════════════════════════════════════
# SECTION 1 — EPIDEMIOLOGY & RISK FACTORS
# ═══════════════════════════════════════════
story.append(banner("1. EPIDEMIOLOGY & RISK FACTORS", INDIGO))
story.append(Spacer(1,5))
epi_left = (
"<b>Prevalence:</b><br/>"
"• Global: 2% women, 0.5% men (JAMA 2023)<br/>"
"• Overt hyperthyroidism: 0.2–1.4% worldwide<br/>"
"• Subclinical hyperthyroidism: 0.7–1.4%<br/>"
"• Accounts for ~70–80% of all hyperthyroidism cases<br/><br/>"
"<b>Demographics:</b><br/>"
"• Female:Male ratio = 5–10:1<br/>"
"• Peak incidence: 30–50 years<br/>"
"• Can occur at any age including children"
)
epi_right = (
"<b>Risk Factors:</b><br/>"
"• Female sex<br/>"
"• Family history of autoimmune thyroid disease<br/>"
"• Personal history of other autoimmune diseases<br/>"
" (Type 1 DM, Addison's, vitiligo, RA, SLE)<br/>"
"• Smoking (especially for ophthalmopathy)<br/>"
"• High iodine intake or iodine contrast exposure<br/>"
"• Post-partum period<br/>"
"• Psychological stress (trigger)<br/>"
"• HLA-DR3, HLA-DQA1 genetic associations"
)
story.append(two_col(epi_left, epi_right))
story.append(Spacer(1,8))
# ═══════════════════════════════════════════
# SECTION 2 — PATHOPHYSIOLOGY
# ═══════════════════════════════════════════
story.append(banner("2. PATHOPHYSIOLOGY", TEAL, "Autoimmune mechanism of TSH receptor stimulation"))
story.append(Spacer(1,5))
story.append(box(
"<b>Core Mechanism:</b> B-lymphocytes produce <b>TSH Receptor-Stimulating Antibodies (TRAb / TSI)</b> "
"that bind to and activate the TSH receptor on thyroid follicular cells. This mimics the action of TSH, "
"driving continuous unregulated thyroid hormone synthesis and secretion. The TSH receptor is also expressed "
"in orbital fibroblasts and pre-adipocytes, explaining the extrathyroidal manifestations "
"(ophthalmopathy, dermopathy).",
PALE_TEAL, TEAL))
story.append(Spacer(1,5))
path_hdrs = [th("Step"), th("Process"), th("Result")]
path_rows = [
[td("<b>1. Immune Trigger</b>"), td("Genetic predisposition (HLA-DR3) + environmental trigger (stress, infection, iodine) → breakdown of self-tolerance to TSH receptor"), td("Autoreactive T and B lymphocytes escape thymic deletion")],
[td("<b>2. Autoantibody Production</b>"), td("B-cells in thyroid, lymph nodes, and bone marrow produce TRAb (TSH Receptor Antibodies), also called TSI (Thyroid-Stimulating Immunoglobulins)"), td("Circulating IgG antibodies targeting TSH-R")],
[td("<b>3. TSH-R Activation</b>"), td("TRAb bind TSH receptor on follicular cells → activate Gs-cAMP pathway (mimics TSH) → unregulated thyroid hormone synthesis"), td("T3 and T4 overproduction — independent of TSH")],
[td("<b>4. TSH Suppression</b>"), td("High circulating T3/T4 → suppress TSH via negative feedback at hypothalamus and pituitary"), td("TSH becomes undetectable (<0.01 mIU/L)")],
[td("<b>5. Goitre Formation</b>"), td("Continuous TSH-R activation → thyrocyte hypertrophy and hyperplasia + increased vascularity (thyroid bruit)"), td("Diffusely enlarged, vascular goitre")],
[td("<b>6. Orbital Involvement</b>"), td("TRAb + cytokines (IL-1, TNF-alpha, IFN-gamma) activate orbital fibroblasts → glycosaminoglycan deposition + adipogenesis + fibrosis → volume expansion of orbital contents"), td("Proptosis, diplopia, optic nerve compression (ophthalmopathy)")],
[td("<b>7. Dermal Involvement</b>"), td("TSH-R on dermal fibroblasts activated → glycosaminoglycan accumulation in dermis of shins"), td("Pretibial myxedema (thyroid dermopathy) in <5%")],
]
story.append(btable(path_hdrs, path_rows, [2.8*cm, 7.4*cm, 6.0*cm], TEAL, PALE_TEAL))
story.append(Spacer(1,8))
story.append(PageBreak())
# ═══════════════════════════════════════════
# SECTION 3 — CLINICAL FEATURES
# ═══════════════════════════════════════════
story.append(banner("3. CLINICAL FEATURES", ROYAL, "Symptoms, signs, and the classic triad"))
story.append(Spacer(1,5))
cf_left = (
"<b>General / Metabolic:</b><br/>"
"• Weight loss despite increased appetite<br/>"
"• Heat intolerance, excessive sweating<br/>"
"• Fatigue and proximal muscle weakness<br/>"
"• Hyperdefecation / diarrhoea<br/>"
"• Oligomenorrhoea / amenorrhoea<br/>"
"• Reduced fertility<br/><br/>"
"<b>Cardiovascular:</b><br/>"
"• Palpitations (sinus tachycardia, AF)<br/>"
"• Widened pulse pressure<br/>"
"• High-output cardiac failure (severe)<br/>"
"• Warm, moist skin; flushing<br/><br/>"
"<b>Neuropsychiatric:</b><br/>"
"• Anxiety, irritability, emotional lability<br/>"
"• Fine tremor (outstretched hands)<br/>"
"• Insomnia, restlessness<br/>"
"• Hyperreflexia"
)
cf_right = (
"<b>Thyroid Examination:</b><br/>"
"• Diffusely enlarged, smooth goitre<br/>"
"• Thyroid bruit (auscultation)<br/>"
"• Goitre may be subtle or absent<br/><br/>"
"<b>Ophthalmopathy (Graves-specific):</b><br/>"
"• Lid retraction, lid lag<br/>"
"• Periorbital oedema, chemosis<br/>"
"• Proptosis (exophthalmos) — >22 mm<br/>"
"• Diplopia, restricted eye movement<br/>"
"• Corneal exposure, ulceration<br/>"
"• Optic nerve compression (sight-threatening)<br/><br/>"
"<b>Skin / Extremities:</b><br/>"
"• Pretibial myxedema (<5%) — indurated,<br/>"
" orange-peel plaques on shins<br/>"
"• Thyroid acropachy (<1%) — clubbing<br/>"
"• Onycholysis (Plummer's nails)"
)
story.append(two_col(cf_left, cf_right, PALE_BLUE, PALE_PUR))
story.append(Spacer(1,6))
story.append(p("<b>The Classic Graves' Triad</b> (not all three required for diagnosis)", h2))
triad_rows = [
[Paragraph("<b>1. Thyrotoxicosis</b>", tdb_s), td("Suppressed TSH with elevated FT3/FT4; symptoms of hormone excess")],
[Paragraph("<b>2. Diffuse Goitre</b>", tdb_s), td("Smooth, diffusely enlarged thyroid; may have bruit; hypervascular on USS/Doppler")],
[Paragraph("<b>3. Ophthalmopathy</b>", tdb_s), td("Present in ~33% clinically; most patients have subclinical orbital changes on imaging; unique to Graves' disease")],
]
tri_t = Table([[th("Feature"), th("Description")]] + triad_rows, colWidths=[4.5*cm, BW-4.5*cm])
tri_t.setStyle(TableStyle([
('BACKGROUND',(0,0),(-1,0), ROYAL),
('ROWBACKGROUNDS',(0,1),(-1,-1),[PALE_BLUE, WHITE]),
('GRID',(0,0),(-1,-1), 0.35, MGREY),
('TOPPADDING',(0,0),(-1,-1), 5),
('BOTTOMPADDING',(0,0),(-1,-1), 5),
('LEFTPADDING',(0,0),(-1,-1), 8),
('VALIGN',(0,0),(-1,-1),'MIDDLE'),
]))
story.append(tri_t)
story.append(Spacer(1,8))
story.append(PageBreak())
# ═══════════════════════════════════════════
# SECTION 4 — DIAGNOSIS
# ═══════════════════════════════════════════
story.append(banner("4. DIAGNOSIS", CYAN_D, "Laboratory, imaging, and differential diagnosis"))
story.append(Spacer(1,5))
story.append(p("<b>Thyroid Function Tests — Interpretation</b>", h2))
lab_hdrs = [th("Test"), th("Finding in Graves'"), th("Normal Range"), th("Significance")]
lab_rows = [
[td("TSH (sensitive)"), tdc("<b>Suppressed</b><br/><0.1 mIU/L (overt)<br/><0.01 mIU/L (severe)"), tdc("0.4–4.5 mIU/L"), td("First-line test; most sensitive indicator of hyperthyroidism; suppressed in all overt cases")],
[td("Free T4 (FT4)"), tdc("Elevated"), tdc("9–25 pmol/L<br/>(0.7–1.9 ng/dL)"), td("Confirms biochemical hyperthyroidism; elevated in most cases")],
[td("Free T3 (FT3)"), tdc("Elevated<br/>(may be elevated alone in T3 toxicosis)"), tdc("3.5–7.8 pmol/L"), td("T3 toxicosis: FT3 elevated but FT4 normal; common in early Graves' or toxic adenoma")],
[td("Total T3"), tdc("Elevated"), tdc("0.9–2.5 nmol/L"), td("Can be affected by binding proteins; less reliable than FT3")],
[td("Total T4"), tdc("Elevated"), tdc("58–161 nmol/L<br/>(4.5–12.5 mcg/dL)"), td("See Kuni Muduli result: 12.73 mcg/dL — at upper limit")],
[td("TRAb (TSH Receptor Antibodies)<br/>= TSI = TBII"), tdc("Positive<br/>>1.75 IU/L (positive)"), tdc("<1.75 IU/L (negative)"), td("Diagnostic for Graves'; positive in ~95%; guides diagnosis when isotope scan unavailable; predicts relapse risk")],
[td("Anti-TPO antibodies"), tdc("Often positive<br/>(70–80%)"), tdc("<35 IU/mL"), td("Marker of autoimmune thyroid disease; less specific than TRAb")],
[td("Anti-thyroglobulin (ATG)"), tdc("May be positive"), tdc("<40 IU/mL"), td("Less specific; used alongside TPO")],
[td("Thyroid Ultrasound + Doppler"), tdc("Diffuse enlargement;<br/>increased vascularity<br/>(inferno sign)"), tdc("Vol: 8–18 mL (F)<br/>10–25 mL (M)"), td("First-line imaging; differentiates Graves' from thyroiditis (low vascularity) and toxic nodules")],
[td("Radionuclide Scan<br/>(Tc-99m or I-123)"), tdc("Diffusely increased<br/>homogeneous uptake"), tdc("Varies by centre"), td("Confirms Graves' (diffuse uptake) vs toxic adenoma (focal hot nodule) vs thyroiditis (low/patchy uptake)")],
[td("Serum Calcium"), tdc("May be mildly elevated"), tdc("2.15–2.55 mmol/L"), td("Mild hypercalcaemia from bone resorption; assess if symptomatic")],
[td("LFTs, FBC"), tdc("Baseline for ATD"), tdc("Normal"), td("Pre-treatment baseline; carbimazole/PTU can cause agranulocytosis or hepatotoxicity")],
[td("Ferritin, Vit B12"), tdc("May be low"), tdc("Normal"), td("Weight loss, malabsorption can cause nutritional deficiencies")],
]
story.append(btable(lab_hdrs, lab_rows, [3.5*cm, 2.5*cm, 2.5*cm, 7.7*cm], CYAN_D, PALE_CYAN))
story.append(Spacer(1,6))
story.append(p("<b>Differential Diagnosis of Hyperthyroidism</b>", h2))
dd_hdrs = [th("Cause"), th("TRAb"), th("TSH Scan"), th("USS Features"), th("Distinguishing Clue")]
dd_rows = [
[td("<b>Graves' Disease</b>"), tdc("Positive 95%"), tdc("Diffuse ↑ uptake"), tdc("Diffuse enlargement, hypervascular"), td("Ophthalmopathy; diffuse goitre; TRAb positive; peak 30–50 yrs female")],
[td("Toxic Multinodular Goitre (MNG)"), tdc("Negative"), tdc("Patchy ↑ in nodules"), tdc("Multiple nodules, heterogeneous"), td("Older patients; palpable nodules; no eye signs")],
[td("Toxic Adenoma (Plummer's disease)"), tdc("Negative"), tdc("Single 'hot' nodule; rest suppressed"), tdc("Dominant nodule"), td("Single palpable nodule; FNA if needed")],
[td("Subacute (De Quervain's) Thyroiditis"), tdc("Negative"), tdc("Globally reduced uptake"), tdc("Hypoechoic, heterogeneous"), td("Painful tender thyroid; post-viral; elevated ESR/CRP; self-limiting")],
[td("Silent / Post-partum Thyroiditis"), tdc("Anti-TPO positive"), tdc("Globally low uptake"), tdc("Heterogeneous"), td("Post-partum; painless; self-limiting; hypothyroid phase follows")],
[td("Exogenous Thyrotoxicosis"), tdc("Negative"), tdc("Globally low uptake"), tdc("Small atrophic gland"), td("Thyroid hormone medication; low thyroglobulin")],
[td("TSH-Secreting Pituitary Adenoma"), tdc("Negative"), tdc("Diffuse ↑ uptake"), tdc("Diffuse enlargement"), td("Elevated TSH (not suppressed); MRI pituitary")],
[td("Gestational Thyrotoxicosis"), tdc("Negative"), tdc("Avoid in pregnancy"), tdc("Normal or mildly enlarged"), td("First trimester; hCG-driven; self-limiting; TRAb negative")],
]
story.append(btable(dd_hdrs, dd_rows, [3.2*cm, 1.8*cm, 2.4*cm, 3.2*cm, 5.6*cm], CYAN_D, PALE_CYAN))
story.append(Spacer(1,8))
story.append(PageBreak())
# ═══════════════════════════════════════════
# SECTION 5 — TREATMENT
# ═══════════════════════════════════════════
story.append(banner("5. TREATMENT OPTIONS", GREEN, "Antithyroid drugs, radioiodine, and surgery — comparative guide"))
story.append(Spacer(1,5))
story.append(box(
"<b>Three Treatment Modalities:</b> (1) Antithyroid drugs (ATDs/thionamides) — carbimazole, "
"methimazole, propylthiouracil; (2) Radioactive iodine (RAI, I-131); (3) Thyroidectomy. "
"No single 'best' treatment — choice must be <b>individualised</b> based on goitre size, "
"severity, age, pregnancy status, ophthalmopathy, patient preference, and available resources "
"(Harrison's 22E, 2025 / ATA Guidelines).",
PALE_GRN, GREEN))
story.append(Spacer(1,5))
# Treatment comparison table
tc_hdrs = [th("Feature"), th("Antithyroid Drugs\n(ATD)"), th("Radioactive Iodine\n(I-131)"), th("Thyroidectomy")]
tc_rows = [
[td("<b>Mechanism</b>"), td("Inhibit thyroid peroxidase (TPO) → block T3/T4 synthesis; PTU also inhibits peripheral T4→T3 conversion"), td("I-131 concentrated by thyroid → beta radiation destroys follicular cells → gland ablation over weeks-months"), td("Surgical removal of thyroid tissue; near-total or total thyroidectomy for Graves'")],
[td("<b>First-line use</b>"), td("YES — preferred initial therapy globally and in India"), td("Preferred in USA, older patients; definitive option"), td("Definitive; used for large goitres, failed ATD/RAI, or ophthalmopathy concerns")],
[td("<b>Onset of action</b>"), td("4–8 weeks for euthyroidism"), td("6–18 weeks (slow onset)"), td("Immediate (intraoperative euthyroidism ideally achieved pre-op)")],
[td("<b>Remission rate</b>"), td("~50% after 12–18 months ATD; higher in small goitres, mild disease"), td("~90% achieve euthyroidism or hypothyroidism after 1 dose"), td("~99% cure of hyperthyroidism")],
[td("<b>Relapse rate</b>"), td("~50% relapse within 2 years of stopping ATD; ~21% after RAI (Symptom to Diagnosis 4e)"), td("Low relapse (<5%)"), td("Very rare if total thyroidectomy performed")],
[td("<b>Ophthalmopathy</b>"), td("Neutral effect on TED"), td("Risk of TED worsening (~15–20%); steroid prophylaxis recommended if mild active TED (Bartalena 2025)"), td("Preferred over RAI when moderate-severe active TED (Bartalena 2025)")],
[td("<b>Pregnancy</b>"), td("YES — PTU preferred in 1st trimester; CBZ/MMI in 2nd-3rd"), td("CONTRAINDICATED"), td("2nd trimester only if ATD fails/intolerance")],
[td("<b>Hypothyroidism risk</b>"), td("Low during treatment; may develop later"), td("~80–90% become hypothyroid within 1 year (expected outcome)"), td("~100% lifelong hypothyroidism after total thyroidectomy")],
[td("<b>Main advantages</b>"), td("Non-invasive; avoids radiation; allows remission; maintains TRAb monitoring; reversible"), td("Single outpatient dose; no surgery; cost-effective; curative"), td("Rapid cure; pathology available; suitable in large goitres, malignancy concern, non-compliant patients")],
[td("<b>Main disadvantages / risks</b>"), td("Agranulocytosis (0.3%); hepatotoxicity (PTU); rash; need for compliance; relapse common"), td("Radiation precautions; delayed action; worsens TED; permanent hypothyroidism; contraindicated in pregnancy"), td("Surgical risks: hypoparathyroidism (2%), RLN palsy (1%), bleeding, GA risk; lifelong levothyroxine")],
]
story.append(btable(tc_hdrs, tc_rows, [2.8*cm, 4.8*cm, 4.4*cm, 4.2*cm], GREEN, PALE_GRN))
story.append(Spacer(1,6))
# ATD detailed dosing
story.append(p("<b>Antithyroid Drug (ATD) — Dosing & Regimens</b>", h2))
atd_hdrs = [th("Drug"), th("Starting Dose"), th("Maintenance"), th("Special Notes")]
atd_rows = [
[td("<b>Carbimazole (CBZ)</b>"), td("20–40 mg/day orally (single or divided dose)"), td("5–15 mg/day once euthyroid (titration) OR 40 mg/day + levothyroxine (block-and-replace)"), td("Converted to active methimazole in vivo. Preferred in UK and India. Avoid in 1st trimester pregnancy (aplasia cutis risk). Available 5 mg, 10 mg, 20 mg tablets.")],
[td("<b>Methimazole (MMI)</b>"), td("20–40 mg/day (15 mg = approx 150 mg PTU)"), td("5–15 mg/day"), td("Direct active drug. Preferred in USA. Avoid in 1st trimester. Once-daily dosing possible. Same mechanism as CBZ.")],
[td("<b>Propylthiouracil (PTU)</b>"), td("300–600 mg/day in divided doses (every 6–8 hrs)"), td("50–200 mg/day in 2–3 divided doses"), td("PREFERRED in 1st trimester pregnancy and thyroid storm (also blocks T4→T3 conversion). Risk: ANCA-positive vasculitis, hepatotoxicity (monitor LFTs). Not for routine long-term use.")],
[td("<b>Beta-blockers</b><br/>(adjunct — NOT anti-thyroid)"), td("Propranolol 40–80 mg TID<br/>Atenolol 50–100 mg OD"), td("As needed until euthyroid"), td("Rapid symptom relief (palpitations, tremor, anxiety). Do not alter thyroid hormone levels. Useful bridge while ATD takes effect. Avoid in asthma.")],
[td("<b>Potassium Iodide</b><br/>(short-term only)"), td("Lugol's iodine 5 drops TID<br/>SSKI 1–2 drops TID"), td("7–14 days max before surgery or in thyroid storm"), td("Wolff-Chaikoff effect — blocks thyroid hormone release. Escape occurs after 10–14 days. Used pre-operatively to reduce vascularity.")],
]
story.append(btable(atd_hdrs, atd_rows, [2.8*cm, 3.0*cm, 3.5*cm, 6.9*cm], GREEN, PALE_GRN))
story.append(Spacer(1,5))
# Two regimens
story.append(p("<b>ATD Treatment Regimens</b>", h2))
reg_rows = [
[Paragraph("<b>TITRATION REGIMEN</b><br/>(Preferred)", tdb_s),
td("Start high dose ATD → monitor TFTs every 4–6 weeks → titrate dose DOWN as T3/T4 normalise → maintain minimum dose for 12–18 months → trial of withdrawal<br/><i>Pros: lower overall ATD dose, less hypothyroidism risk</i>")],
[Paragraph("<b>BLOCK-AND-REPLACE</b><br/>(Alternative)", tdb_s),
td("Fixed high-dose ATD (e.g., carbimazole 40 mg/day) PLUS levothyroxine (75–100 mcg/day) throughout → avoids hypothyroidism during treatment → no dose adjustments needed<br/><i>Pros: stable thyroid levels, simpler monitoring</i><br/><i>Cons: higher total drug dose, more side effects, NOT for use in pregnancy</i>")],
]
reg_t = Table([[th("Regimen"), th("Description")]] + reg_rows, colWidths=[3.5*cm, BW-3.5*cm])
reg_t.setStyle(TableStyle([
('BACKGROUND',(0,0),(-1,0), GREEN),
('ROWBACKGROUNDS',(0,1),(-1,-1),[PALE_GRN, WHITE]),
('GRID',(0,0),(-1,-1), 0.35, MGREY),
('TOPPADDING',(0,0),(-1,-1), 5),
('BOTTOMPADDING',(0,0),(-1,-1), 5),
('LEFTPADDING',(0,0),(-1,-1), 8),
('VALIGN',(0,0),(-1,-1),'TOP'),
]))
story.append(reg_t)
story.append(Spacer(1,8))
story.append(PageBreak())
# Indications table
story.append(banner("5b. TREATMENT SELECTION — WHO GETS WHAT?", PURPLE))
story.append(Spacer(1,5))
sel_hdrs = [th("Clinical Situation"), th("Preferred Treatment"), th("Rationale")]
sel_rows = [
[td("First presentation, mild-moderate, no TED, young patient"), td("<b>ATD (titration regimen)</b><br/>12–18 months trial"), td("Non-invasive; preserves chance of remission; monitors TRAb response")],
[td("Relapse after ATD course"), td("<b>RAI or thyroidectomy</b><br/>(definitive)"), td("Second ATD course has low remission rate; move to definitive therapy")],
[td("Large goitre (>80 g) or compressive symptoms"), td("<b>Thyroidectomy preferred</b>"), td("RAI less effective in large glands; surgery provides immediate decompression")],
[td("Moderate to severe, active TED"), td("<b>ATD first; thyroidectomy if definitive therapy needed</b><br/>AVOID RAI"), td("RAI worsens TED in 15–20% (Bartalena & Smith, JCEM 2025)")],
[td("Mild inactive TED"), td("Any modality; if RAI: add steroid prophylaxis"), td("Low TED progression risk; short course prednisolone (0.4–0.5 mg/kg × 3 months) if RAI chosen")],
[td("Pregnant (1st trimester)"), td("<b>PTU first-line</b>"), td("CBZ/MMI risk: aplasia cutis, choanal atresia; PTU lower teratogenicity in T1")],
[td("Pregnant (2nd–3rd trimester)"), td("<b>Switch to CBZ/MMI</b>"), td("PTU hepatotoxicity risk outweighs benefits after T1; use lowest effective dose")],
[td("Planning pregnancy (<6 months)"), td("<b>ATD</b> (avoid RAI; allow 6 months after RAI before conception)"), td("RAI in pregnancy is absolutely contraindicated")],
[td("Elderly or high surgical risk"), td("<b>RAI preferred</b>"), td("Definitive; avoids surgical risk in comorbid elderly patients")],
[td("Thyroid malignancy co-existing with Graves'"), td("<b>Thyroidectomy</b>"), td("RAI is inappropriate; pathological diagnosis needed")],
[td("Non-compliant patient or inability to monitor"), td("<b>RAI or thyroidectomy</b>"), td("Definitive therapy avoids reliance on daily medication compliance")],
[td("Children and adolescents"), td("<b>Carbimazole / MMI for ≥3 years</b><br/>Avoid PTU"), td("PTU: hepatotoxicity risk higher in children; long ATD course before considering surgery/RAI")],
[td("Severe thyrotoxicosis or cardiac compromise"), td("<b>ATD (high dose) + beta-blocker</b> → definitive therapy after stabilisation"), td("Stabilise first; radioiodine may worsen temporarily; surgery after ATD preparation")],
]
story.append(btable(sel_hdrs, sel_rows, [4.2*cm, 4.5*cm, 7.5*cm], PURPLE, PALE_PUR))
story.append(Spacer(1,8))
story.append(PageBreak())
# ═══════════════════════════════════════════
# SECTION 6 — GRAVES' OPHTHALMOPATHY
# ═══════════════════════════════════════════
story.append(banner("6. GRAVES' OPHTHALMOPATHY (THYROID EYE DISEASE — TED)", RED_D,
"Most consequential extrathyroidal manifestation — unique to Graves' disease"))
story.append(Spacer(1,5))
story.append(box(
"<b>Prevalence:</b> Clinical TED in ~33% of Graves' patients; subclinical orbital changes on imaging in most. "
"Onset within 1 year before/after thyrotoxicosis in 75% of cases. Unilateral in up to 10%. "
"<b>Smoking is the most important modifiable risk factor</b> — all patients must be strongly advised to stop smoking.",
PALE_RED, RED_D))
story.append(Spacer(1,5))
story.append(p("<b>NO SPECS Classification (Harrison's 22E)</b>", h2))
nospecs = [
["0", "No signs or symptoms"],
["I", "Only signs: lid retraction or lid lag; no symptoms"],
["II", "Soft tissue involvement: periorbital oedema, chemosis, conjunctival injection"],
["III", "Proptosis: exophthalmos >22 mm (measured by exophthalmometer)"],
["IV", "Extraocular muscle involvement: diplopia (typically on upward/lateral gaze)"],
["V", "Corneal involvement: exposure keratopathy, corneal ulceration"],
["VI", "Sight loss: optic nerve compression → papilloedema, visual field defects, colour vision loss"],
]
ns_hdrs = [th("Class"), th("Features")]
ns_rows = [[td(c), td(f)] for c, f in nospecs]
ns_t = btable(ns_hdrs, ns_rows, [1.5*cm, BW-1.5*cm], RED_D, PALE_RED)
story.append(ns_t)
story.append(Spacer(1,4))
story.append(p("Note: The EUGOGO (European Group on Graves' Orbitopathy) Clinical Activity Score (CAS) is preferred over NO SPECS for monitoring disease activity (pain, redness, swelling scoring 0–7; active ≥3/7).", note))
story.append(Spacer(1,5))
story.append(p("<b>Management of Graves' Ophthalmopathy</b>", h2))
ted_hdrs = [th("Severity / Activity"), th("Management")]
ted_rows = [
[td("<b>Mild TED</b><br/>(Class I–II, CAS <3)"), td("• Supportive: lubricating eye drops, gel at night, dark glasses<br/>• Selenium 200 mcg/day × 6 months (EUGOGO recommendation — reduces progression)<br/>• Smoking cessation MANDATORY<br/>• Treat hyperthyroidism (any modality; steroid prophylaxis if RAI chosen)<br/>• Monitor closely; reassess at 3–6 months")],
[td("<b>Moderate-Severe, ACTIVE TED</b><br/>(CAS ≥3; diplopia, proptosis,<br/>soft tissue involvement)"), td("• Ophthalmology referral URGENT<br/>• IV methylprednisolone 500 mg weekly × 6 weeks, then 250 mg weekly × 6 weeks (EUGOGO protocol)<br/>• Orbital radiotherapy (adjunct to IV steroids in severe cases)<br/>• <b>Avoid RAI</b> — use ATD or thyroidectomy for hyperthyroidism<br/>• Biological therapies: Teprotumumab (IGF-1R inhibitor, FDA approved 2020) in eligible cases — reduces proptosis significantly")],
[td("<b>Sight-Threatening TED</b><br/>(Class VI: optic nerve compression<br/>or corneal breakdown)"), td("• EMERGENCY — same-day ophthalmology/orbital surgeon involvement<br/>• IV methylprednisolone 500–1000 mg/day × 3 days (pulse therapy)<br/>• If no response in 1–2 weeks: urgent orbital decompression surgery<br/>• Corneal exposure: tape eyelids, high-viscosity lubricants, urgent surgery if not responding")],
[td("<b>Inactive TED</b><br/>(Burned out, stable, CAS <3)"), td("• Rehabilitative surgery sequence: (1) orbital decompression → (2) strabismus/squint surgery → (3) eyelid surgery<br/>• Surgery only when TED has been inactive for ≥6 months")],
]
ted_t = btable(ted_hdrs, ted_rows, [3.2*cm, BW-3.2*cm], RED_D, PALE_RED)
story.append(ted_t)
story.append(Spacer(1,8))
story.append(PageBreak())
# ═══════════════════════════════════════════
# SECTION 7 — COMPLICATIONS
# ═══════════════════════════════════════════
story.append(banner("7. COMPLICATIONS OF GRAVES' DISEASE", ORANGE,
"Cardiac, metabolic, skeletal, drug-related, and thyroid storm"))
story.append(Spacer(1,5))
comp_hdrs = [th("Complication"), th("Mechanism"), th("Features"), th("Management")]
comp_rows = [
[td("<b>Thyroid Storm</b><br/>(Thyrotoxic Crisis)"),
td("Extreme thyroid hormone excess → massive sympathetic activation + multi-organ failure"),
td("Fever (>38.5°C), tachycardia (>140), AF, hypertension then hypotension, agitation, confusion, coma, vomiting, diarrhoea; precipitated by surgery, infection, contrast, trauma, non-compliance<br/><i>Burch-Wartofsky score >45 = thyroid storm</i>"),
td("EMERGENCY:<br/>1. PTU 600 mg stat, then 250 mg q6h (blocks synthesis + T4→T3 conversion)<br/>2. Lugol's iodine 10 drops TID (1 hr AFTER PTU)<br/>3. Dexamethasone 2 mg q6h (inhibits T4→T3 conversion, treats adrenal insufficiency)<br/>4. Propranolol 60–80 mg q4–6h (or IV if unable to take orally)<br/>5. ICU admission; treat precipitant; cooling; fluid resuscitation<br/>6. Cholestyramine (binds T4 in gut, reduces enterohepatic circulation)")],
[td("<b>Atrial Fibrillation</b>"),
td("↑ heart rate + ↑ sympathetic tone → AF; hyperthyroidism is a treatable cause of AF"),
td("Present in 10–15% of Graves'; risk of thromboembolism"),
td("Rate control: beta-blockers or digoxin (digoxin less effective in high-output state)<br/>Anticoagulation: heparin/warfarin/DOAC if AF persistent<br/>Cardioversion after achieving euthyroid state; ~60% revert to sinus rhythm after treatment")],
[td("<b>Osteoporosis</b>"),
td("↑ bone turnover (osteoclast activation by thyroid hormones); ↑ calcium, ↓ PTH"),
td("↑ fracture risk, especially in post-menopausal women; asymptomatic initially"),
td("Treat hyperthyroidism promptly<br/>DEXA scan if prolonged hyperthyroidism<br/>Calcium + Vitamin D supplementation<br/>Bisphosphonates if T-score <−2.5")],
[td("<b>Agranulocytosis</b><br/>(ATD complication)"),
td("Immune-mediated destruction of granulocytes by carbimazole or PTU; incidence ~0.3%"),
td("Fever, sore throat, mouth ulcers — typically within first 3 months of ATD<br/>ANC <0.5 × 10⁹/L"),
td("STOP ATD IMMEDIATELY — DO NOT rechallenge with either drug<br/>Urgent FBC<br/>Filgrastim (G-CSF) if severe<br/>Alternative: RAI or surgery")],
[td("<b>Hepatotoxicity</b><br/>(PTU complication)"),
td("PTU-induced fulminant hepatic necrosis (idiosyncratic; rare but serious)"),
td("Jaundice, nausea, elevated LFTs; can progress to fulminant hepatic failure"),
td("Monitor LFTs at baseline and symptomatically<br/>STOP PTU immediately if symptomatic<br/>Switch to CBZ/MMI (different mechanism)<br/>Urgent hepatology referral if severe")],
[td("<b>Heart Failure</b>"),
td("High-output cardiac failure from sustained tachycardia and ↑ cardiac output"),
td("Biventricular failure, oedema, dyspnoea; reversible with treatment"),
td("Treat hyperthyroidism urgently<br/>Rate control; diuretics; cardiology referral")],
[td("<b>Reproductive Complications</b>"),
td("↑ sex-hormone binding globulin + HPG axis effects"),
td("Oligomenorrhoea, amenorrhoea, reduced fertility; miscarriage risk, preterm birth if untreated in pregnancy"),
td("Treat hyperthyroidism promptly<br/>Close monitoring in pregnancy (TFTs every 4 weeks)<br/>Lowest effective ATD dose in pregnancy")],
[td("<b>Hypoparathyroidism</b><br/>(post-thyroidectomy)"),
td("Parathyroid gland injury or removal during thyroidectomy"),
td("Hypocalcaemia: perioral tingling, carpopedal spasm (Trousseau/Chvostek signs), tetany, seizures"),
td("Calcium gluconate IV (acute)<br/>Oral calcium carbonate + activated vitamin D (alfacalcidol/calcitriol) long-term<br/>Experienced surgeon reduces risk to ~2%")],
[td("<b>RLN Palsy</b><br/>(post-thyroidectomy)"),
td("Recurrent laryngeal nerve injury during surgery"),
td("Unilateral: hoarseness; bilateral: stridor, respiratory distress"),
td("Pre-operative laryngoscopy baseline<br/>Intraoperative neuromonitoring<br/>Unilateral: usually recovers; bilateral: may need tracheostomy acutely")],
]
story.append(btable(comp_hdrs, comp_rows, [2.8*cm, 3.0*cm, 4.0*cm, 6.4*cm], ORANGE, PALE_ORG))
story.append(Spacer(1,8))
story.append(PageBreak())
# ═══════════════════════════════════════════
# SECTION 8 — SPECIAL POPULATIONS
# ═══════════════════════════════════════════
story.append(banner("8. SPECIAL POPULATIONS", AMBER))
story.append(Spacer(1,5))
sp_hdrs = [th("Population"), th("Key Considerations"), th("Management Approach")]
sp_rows = [
[td("<b>Pregnancy</b>"), td("Uncontrolled Graves' → miscarriage, preterm birth, IUGR, fetal thyrotoxicosis (TRAb crosses placenta), neonatal thyrotoxicosis; ATDs also cross placenta"), td("1st trimester: PTU (lowest effective dose); 2nd-3rd trimester: switch to CBZ/MMI; TFTs every 4 weeks; TRAb titre in 3rd trimester predicts neonatal thyrotoxicosis; target FT4 high-normal; NO RAI; surgery (2nd trimester) if ATD failure")],
[td("<b>Neonates / Infants</b>"), td("Neonatal thyrotoxicosis from transplacental TRAb; manifests day 1–14 post-birth; tachycardia, irritability, poor feeding, exophthalmos"), td("Monitor neonates of Graves' mothers; TFTs at birth and day 5–7; treat with ATD if needed; may require iodide drops; usually self-resolving as maternal TRAb clears (half-life ~3 weeks)")],
[td("<b>Children & Adolescents</b>"), td("ATD first-line for 3+ years; PTU avoided due to hepatotoxicity risk; relapse common; surgery or RAI for persistent/relapsing disease"), td("Carbimazole / methimazole; monitor growth; school performance; psychological support; RAI is used in older children but surgery preferred in younger children with large goitre")],
[td("<b>Elderly (>65 years)</b>"), td("'Apathetic thyrotoxicosis' — atypical presentation: weight loss, AF, depression, weakness without classical features; ↑ osteoporosis, AF, cardiovascular risk"), td("RAI often preferred (avoids surgical risk); ATD as initial bridge; aggressive cardiovascular risk management; bone protection")],
[td("<b>Active/Moderate-Severe TED</b>"), td("Hyperthyroidism treatment choice critically impacts TED course (Bartalena 2025)"), td("ATD preferred; thyroidectomy acceptable; AVOID RAI; IV steroids for TED; ophthalmology co-management")],
[td("<b>Breastfeeding</b>"), td("ATDs transfer to breast milk; PTU preferred (lower milk transfer than CBZ); avoid high doses"), td("PTU <300 mg/day or CBZ <20 mg/day considered compatible with breastfeeding; monitor infant TFTs")],
[td("<b>Amiodarone-related</b>"), td("Amiodarone contains 37% iodine; can trigger thyrotoxicosis in Graves' or cause type 1/2 AIT"), td("Complex management; iodine loading makes RAI less effective; low-dose carbimazole + steroids; thyroidectomy may be needed")],
]
story.append(btable(sp_hdrs, sp_rows, [2.5*cm, 5.0*cm, 8.7*cm], AMBER, PALE_AMB))
story.append(Spacer(1,8))
# ═══════════════════════════════════════════
# SECTION 9 — MONITORING TABLE
# ═══════════════════════════════════════════
story.append(banner("9. MONITORING DURING TREATMENT", SLATE))
story.append(Spacer(1,5))
mon_hdrs = [th("Parameter"), th("On ATD\n(First 3 months)"), th("On ATD\n(Maintenance)"), th("After RAI"), th("After Surgery"), th("Target")]
mon_rows = [
[td("TSH"), tdc("Every 4–6 wks"), tdc("Every 3 months"), tdc("4–6 weekly × 6 months"), tdc("6 weekly × 3 months"), td("0.4–4.5 mIU/L (maintenance)")],
[td("Free T4 / Free T3"), tdc("Every 4–6 wks"), tdc("Every 3–6 months"), tdc("Every 4–6 wks"), tdc("Every 6 wks"), td("Normal range; T3 normalises last")],
[td("TRAb (TRAb/TSI)"), tdc("At 12–18 months"), tdc("Before stopping ATD"), tdc("Annually"), tdc("At 3–6 months"), td("Negative = remission likely; positive = relapse risk")],
[td("FBC (white cell count)"), tdc("Before starting; if fever/sore throat"), tdc("If symptomatic"), tdc("Not required"), tdc("Post-op"), td("WBC >4.0; ANC >1.5; STOP ATD if ANC <1.0")],
[td("LFTs"), tdc("Baseline; if jaundice/abdominal pain"), tdc("If symptomatic"), tdc("Not required"), tdc("Post-op"), td("Normal; STOP PTU if ALT >3× ULN")],
[td("Serum Calcium"), tdc("Baseline"), tdc("Not routine"), tdc("Not routine"), tdc("Daily for 48 hrs post-op"), td("2.15–2.55 mmol/L; post-op hypo = parathyroid damage")],
[td("Anti-TPO / TRAb"), tdc("At baseline"), tdc("Before stopping"), tdc("Annually"), tdc("3–6 months"), td("Falling TRAb = good prognostic sign")],
[td("DEXA Bone Scan"), tdc("If prolonged thyrotoxicosis or post-menopausal"), tdc("2-yearly"), tdc("2-yearly"), tdc("2-yearly"), td("T-score > −1.0; bisphosphonate if < −2.5")],
[td("ECG"), tdc("If AF / cardiac symptoms"), tdc("As needed"), tdc("As needed"), tdc("Post-op"), td("Sinus rhythm; monitor for AF")],
[td("Eye examination"), tdc("Baseline + every clinic visit"), tdc("Annually"), tdc("Pre-RAI + 3 months post"), tdc("Annually"), td("CAS <3; no progression of TED")],
]
story.append(btable(mon_hdrs, mon_rows,
[3.0*cm, 2.2*cm, 2.2*cm, 2.2*cm, 2.2*cm, 4.4*cm], SLATE, LGREY))
story.append(Spacer(1,8))
story.append(PageBreak())
# ═══════════════════════════════════════════
# SECTION 10 — KEY EVIDENCE
# ═══════════════════════════════════════════
story.append(banner("10. KEY EVIDENCE & REFERENCES", INDIGO))
story.append(Spacer(1,5))
ev_hdrs = [th("Source"), th("Year"), th("Key Finding"), th("PMID / Ref")]
ev_rows = [
[td("Lee & Pearce, JAMA"), tdc("2023"), td("Graves' disease global prevalence: 2% women, 0.5% men. Overt hyperthyroidism 0.2–1.4%. First-line: ATD, RAI, or surgery — individualise. Untreated: AF, HF, osteoporosis, increased mortality."), td("PMID 37847271")],
[td("Bartalena & Smith, J Clin Endocrinol Metab"), tdc("2025"), td("RAI associated with TED de novo or worsening in 15–20%. Moderate-severe active TED: ATD or surgery preferred over RAI. Steroid prophylaxis mandatory if RAI used in mild active TED. Teprotumumab effective for proptosis."), td("PMID 39787151")],
[td("Harrison's Principles of Internal Medicine 22E"), tdc("2025"), td("Comprehensive Graves' chapter: ophthalmopathy in 33%; NO SPECS classification; ATD regimens; carbimazole preferred in UK; surgery indication for moderate-severe active TED; children: CBZ ≥3 years."), td("McGraw-Hill 2025")],
[td("Tietz Textbook of Laboratory Medicine 7e"), tdc("2022"), td("TFT interpretation: carbimazole + methimazole + PTU mechanisms (TPO inhibition); PTU additionally inhibits T4→T3 conversion."), td("Tietz 7e")],
[td("Sabiston Textbook of Surgery"), tdc("2024"), td("Surgical treatment selection table: active Graves' ophthalmopathy — prefer surgery (!) or RAI with extreme caution; inactive TED — all three modalities acceptable."), td("Sabiston 21e")],
[td("ATA Guidelines (Ross et al.)"), tdc("2016"), td("Comprehensive evidence-based guideline on diagnosis and management of hyperthyroidism including Graves'. Still widely referenced; updated recommendations pending."), td("Thyroid 2016;26:1343")],
[td("EUGOGO Consensus (Bartalena et al.)"), tdc("2021"), td("European consensus on Graves' orbitopathy management: IV glucocorticoids first-line for active moderate-severe TED; selenium for mild TED; EUGOGO CAS preferred over NO SPECS for activity scoring."), td("Eur Thyroid J 2021")],
[td("Symptom to Diagnosis 4e"), tdc("2022"), td("RAI relapse rate ~21%; clinical diagnosis approach for thyrotoxicosis including differential diagnosis algorithm."), td("McGraw-Hill 4e")],
]
story.append(btable(ev_hdrs, ev_rows, [3.5*cm, 1.4*cm, 8.9*cm, 2.4*cm], INDIGO, PALE_BLUE))
story.append(Spacer(1,8))
# ─── Quick reference patient card ──────────────────────────────────────────
story.append(banner("QUICK REFERENCE — BURCH-WARTOFSKY SCORE (Thyroid Storm Diagnosis)", RED_D))
story.append(Spacer(1,4))
bw_hdrs = [th("Parameter"), th("Finding"), th("Score"), th("Parameter"), th("Finding"), th("Score")]
bw_rows = [
[td("Temperature"), td("37.2–37.7°C"), tdc("5"), td("CNS dysfunction"), td("Absent"), tdc("0")],
[td(""), td("37.8–38.2°C"), tdc("10"), td(""), td("Mild (agitation)"), tdc("10")],
[td(""), td("38.3–38.8°C"), tdc("15"), td(""), td("Moderate (delirium/psychosis)"), tdc("20")],
[td(""), td("38.9–39.4°C"), tdc("20"), td(""), td("Severe (seizure/coma)"), tdc("30")],
[td(""), td("≥39.5°C"), tdc("30"), td("Precipitating event?"), td("No"), tdc("0")],
[td("Heart Rate"), td("90–109 bpm"), tdc("5"), td(""), td("Yes"), tdc("10")],
[td(""), td("110–119 bpm"), tdc("10"), td("Congestive heart failure"), td("None"), tdc("0")],
[td(""), td("120–129 bpm"), tdc("15"), td(""), td("Mild (pedal oedema)"), tdc("5")],
[td(""), td("130–139 bpm"), tdc("20"), td(""), td("Moderate (bibasilar rales)"), tdc("10")],
[td(""), td("≥140 bpm"), tdc("25"), td(""), td("Severe (pulm oedema)"), tdc("15")],
[td("GI-Hepatic dysfunction"), td("Absent"), tdc("0"), td("Atrial Fibrillation"), td("Absent"), tdc("0")],
[td(""), td("Moderate (diarrhoea,nausea)"), tdc("10"), td(""), td("Present"), tdc("10")],
[td(""), td("Severe (jaundice)"), tdc("20"), td("SCORE INTERPRETATION"), td(">45: Thyroid storm\n25–44: Impending storm\n<25: Unlikely"), tdc("")],
]
bw_t = Table([bw_hdrs] + bw_rows, colWidths=[2.8*cm, 3.0*cm, 1.2*cm, 3.2*cm, 3.5*cm, 1.5*cm])
bw_t.setStyle(TableStyle([
('BACKGROUND',(0,0),(-1,0), RED_D),
('ROWBACKGROUNDS',(0,1),(-1,-1),[PALE_RED, WHITE]),
('GRID',(0,0),(-1,-1), 0.35, MGREY),
('TOPPADDING',(0,0),(-1,-1), 3),
('BOTTOMPADDING',(0,0),(-1,-1), 3),
('LEFTPADDING',(0,0),(-1,-1), 4),
('VALIGN',(0,0),(-1,-1),'MIDDLE'),
('SPAN',(4,12),(5,12)),
('BACKGROUND',(4,12),(5,12), HexColor("#FFD0D0")),
]))
story.append(bw_t)
story.append(Spacer(1,8))
# Disclaimer
story.append(hr(RED_D, 1.0))
story.append(p(
"<b>DISCLAIMER:</b> This guide is for use by licensed healthcare professionals as a clinical "
"reference. It is based on Harrison's Principles of Internal Medicine 22E (2025), JAMA 2023 "
"review (PMID 37847271), J Clin Endocrinol Metab 2025 (PMID 39787151), ATA Guidelines, and "
"major surgery textbooks. All treatment decisions must be individualised and made by a "
"qualified physician. This document does not replace direct clinical assessment. "
"Thyroid storm is a medical emergency requiring ICU-level care.", note))
doc.build(story, onFirstPage=on_page, onLaterPages=on_page)
print(f"SUCCESS: {OUTPUT}")
cd /home/daytona/workspace/homoeopathy-pdf && python generate_graves_pdf.py 2>&1
Homoeopathic Remedies for rt sided sciatica