~/lipid-cheatsheet/generate_cheatsheet.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import cm
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, KeepTogether
)
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_LEFT
from reportlab.platypus import PageBreak
# ββ Output path ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
OUTPUT = "/home/daytona/workspace/lipid-cheatsheet/Lipid_Metabolism_MCQ_Cheatsheet.pdf"
# ββ Colour palette ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
C_NAVY = colors.HexColor("#1a2b5e")
C_TEAL = colors.HexColor("#0d7377")
C_AMBER = colors.HexColor("#e8a020")
C_WARN = colors.HexColor("#c0392b")
C_LGRAY = colors.HexColor("#f4f6fb")
C_MGRAY = colors.HexColor("#dde3f0")
C_WHITE = colors.white
C_BLACK = colors.HexColor("#1c1c1c")
C_GREEN = colors.HexColor("#1a7a4a")
C_PURPLE = colors.HexColor("#6c3483")
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
leftMargin=1.5*cm, rightMargin=1.5*cm,
topMargin=1.5*cm, bottomMargin=1.5*cm,
title="Lipid Metabolism MCQ Cheat Sheet",
author="Orris"
)
W = A4[0] - 3*cm # usable width
styles = getSampleStyleSheet()
def S(name, **kw):
return ParagraphStyle(name, **kw)
# Custom styles
TITLE = S("title_s", fontName="Helvetica-Bold", fontSize=20, textColor=C_WHITE,
alignment=TA_CENTER, spaceAfter=2)
SUBTITLE = S("sub_s", fontName="Helvetica", fontSize=9, textColor=C_MGRAY,
alignment=TA_CENTER, spaceAfter=4)
SEC = S("sec_s", fontName="Helvetica-Bold", fontSize=10, textColor=C_WHITE,
backColor=C_NAVY, alignment=TA_LEFT, leftIndent=4, spaceBefore=8, spaceAfter=2,
borderPad=3)
BODY = S("body_s", fontName="Helvetica", fontSize=8, textColor=C_BLACK,
leading=11, spaceAfter=1)
BOLD = S("bold_s", fontName="Helvetica-Bold", fontSize=8, textColor=C_BLACK, leading=11)
TRAP = S("trap_s", fontName="Helvetica-Bold", fontSize=8, textColor=C_WARN, leading=11)
TH = S("th_s", fontName="Helvetica-Bold", fontSize=7.5, textColor=C_WHITE,
alignment=TA_CENTER)
TD = S("td_s", fontName="Helvetica", fontSize=7.5, textColor=C_BLACK,
alignment=TA_LEFT, leading=10)
TDC = S("tdc_s", fontName="Helvetica", fontSize=7.5, textColor=C_BLACK,
alignment=TA_CENTER, leading=10)
TDB = S("tdb_s", fontName="Helvetica-Bold", fontSize=7.5, textColor=C_BLACK,
alignment=TA_LEFT, leading=10)
def section_header(text, color=C_NAVY):
tbl = Table([[Paragraph(text, S("sh", fontName="Helvetica-Bold", fontSize=9.5,
textColor=C_WHITE, leftIndent=4))]],
colWidths=[W])
tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), color),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0),(-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 6),
]))
return tbl
def bullet(text, color=C_TEAL, indent=0):
bullet_char = "βΈ"
full = f'<font color="#{color.hexval()[2:]}"><b>{bullet_char}</b></font> {text}'
return Paragraph(full, S("b_s", fontName="Helvetica", fontSize=8,
textColor=C_BLACK, leading=11,
leftIndent=8+indent, spaceAfter=1.5))
def sub_bullet(text):
return Paragraph(f" β {text}",
S("sb_s", fontName="Helvetica", fontSize=7.5,
textColor=C_BLACK, leading=10, leftIndent=20, spaceAfter=1))
def highlight_box(items, bg=C_LGRAY, border=C_TEAL):
rows = [[Paragraph(f"β’ {i}", S("hb_s", fontName="Helvetica", fontSize=7.5,
textColor=C_BLACK, leading=11))]
for i in items]
t = Table(rows, colWidths=[W-0.4*cm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), bg),
("LINEAFTER", (0,0),(0,-1), 2, border),
("TOPPADDING", (0,0),(-1,-1), 3),
("BOTTOMPADDING",(0,0),(-1,-1),3),
("LEFTPADDING",(0,0),(-1,-1), 8),
]))
return t
def make_table(headers, rows, col_widths, header_color=C_NAVY):
data = [[Paragraph(h, TH) for h in headers]]
for row in rows:
data.append([Paragraph(str(c), TDC if i > 0 else TD) for i, c in enumerate(row)])
t = Table(data, colWidths=col_widths)
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), header_color),
("ROWBACKGROUNDS",(0,1), (-1,-1), [C_WHITE, C_LGRAY]),
("GRID", (0,0), (-1,-1), 0.3, C_MGRAY),
("TOPPADDING", (0,0), (-1,-1), 3),
("BOTTOMPADDING", (0,0), (-1,-1), 3),
("LEFTPADDING", (0,0), (-1,-1), 4),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
return t
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# BUILD STORY
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
story = []
# ββ TITLE BANNER βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
banner_data = [[
Paragraph("𧬠LIPID METABOLISM", S("tb", fontName="Helvetica-Bold", fontSize=22,
textColor=C_WHITE, alignment=TA_CENTER)),
Paragraph("MCQ Quick Reference Cheat Sheet Β· Biochemistry",
S("ts", fontName="Helvetica", fontSize=9, textColor=C_MGRAY,
alignment=TA_CENTER)),
]]
banner = Table([[Paragraph("𧬠LIPID METABOLISM β MCQ Quick Reference Cheat Sheet",
S("t2", fontName="Helvetica-Bold", fontSize=15,
textColor=C_WHITE, alignment=TA_CENTER))]],
colWidths=[W])
banner.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), C_NAVY),
("TOPPADDING", (0,0),(-1,-1), 10),
("BOTTOMPADDING", (0,0),(-1,-1), 10),
("ROUNDEDCORNERS",[4]),
]))
story.append(banner)
story.append(Spacer(1, 6))
# βββ TWO-COLUMN LAYOUT HELPER βββββββββββββββββββββββββββββββββββββββββββββββββ
def two_col(left_items, right_items, ratio=(0.5, 0.5)):
lw = W * ratio[0] - 4
rw = W * ratio[1] - 4
tbl = Table([[left_items, right_items]], colWidths=[lw+4, rw+4])
tbl.setStyle(TableStyle([
("VALIGN", (0,0),(-1,-1), "TOP"),
("LEFTPADDING", (0,0),(-1,-1), 0),
("RIGHTPADDING",(0,0),(-1,-1), 0),
("TOPPADDING", (0,0),(-1,-1), 0),
("BOTTOMPADDING",(0,0),(-1,-1), 0),
]))
return tbl
# βββ SECTION 1: Ξ²-OXIDATION ββββββββββββββββββββββββββββββββββββββββββββββββββ
s1 = [
section_header("1 Β· FATTY ACID Ξ²-OXIDATION", C_TEAL),
bullet("Location: <b>Mitochondria</b> (LCFA) | <b>Peroxisomes</b> (VLCFA >C22)"),
bullet("Activation: FFA β Acyl CoA (Acyl CoA Synthetase); costs <b>2 ATP</b> (ATPβAMP+PPi)"),
bullet("Carnitine Shuttle: CPT-I (outer) β Translocase β CPT-II (inner) β <b>CPT-I = rate-limiting</b>"),
bullet("<b>Malonyl CoA inhibits CPT-I</b> (fed state blocks oxidation simultaneously with synthesis)"),
Spacer(1, 2),
Paragraph("<b>Each cycle yields:</b>", BOLD),
make_table(["Product","Amount","ATP equiv."],
[["FADHβ","1","1.5"],["NADH","1","2.5"],["Acetyl CoA","1","~10 via TCA"]],
[W*0.38, W*0.3, W*0.32], C_TEAL),
Spacer(1,3),
bullet("Odd-chain FA β last product = <b>Propionyl CoA</b> β needs <b>Biotin</b> (propionyl CoA carboxylase) + <b>B12</b> (methylmalonyl CoA mutase) β Succinyl CoA"),
bullet("<b>Only FA that contributes to gluconeogenesis</b> (via succinyl CoA)"),
bullet("Peroxisomal 1st step: <b>Acyl CoA oxidase</b> β HβOβ (not FADHβ)"),
bullet("Zellweger = peroxisome biogenesis defect β VLCFA β"),
bullet("X-linked ALD = ABCD1 mutation β VLCFA in adrenal/CNS"),
]
# βββ SECTION 2: FA SYNTHESIS βββββββββββββββββββββββββββββββββββββββββββββββββ
s2 = [
section_header("2 Β· FATTY ACID SYNTHESIS (De Novo)", C_PURPLE),
bullet("Location: <b>Cytosol</b> | Main site: Liver, adipose, mammary gland"),
bullet("Acetyl CoA exits mitochondria as <b>citrate</b> β cleaved by <b>ATP-citrate lyase</b>"),
Spacer(1,2),
Paragraph("<b>Rate-limiting step: Acetyl CoA β Malonyl CoA</b>", BOLD),
make_table(["Acetyl CoA Carboxylase (ACC)","Detail"],
[["Cofactor","Biotin"],
["Activated by","Citrate, Insulin (dephosphorylation)"],
["Inhibited by","Palmitoyl CoA, Glucagon, Epinephrine (phosphorylation)"]],
[W*0.38, W*0.62], C_PURPLE),
Spacer(1,3),
bullet("Fatty Acid Synthase (FAS): needs <b>NADPH</b> β makes <b>Palmitate (C16)</b>"),
bullet("Needs: 7 malonyl CoA + 1 acetyl CoA + 14 NADPH"),
bullet("NADPH sources: <b>Pentose Phosphate Pathway</b> (main) + Malic enzyme"),
bullet("Elongation: <b>ER</b> | Desaturation: <b>ER</b> (Ξ9-desaturase)"),
bullet("Essential FA (cannot synthesize): <b>Linoleic</b> (Ο-6, C18:2) + <b>Ξ±-Linolenic</b> (Ο-3, C18:3)"),
]
story.append(two_col(s1, s2, (0.49, 0.51)))
story.append(Spacer(1, 5))
# βββ SECTION 3: KETONE BODIES ββββββββββββββββββββββββββββββββββββββββββββββββ
s3_left = [
section_header("3 Β· KETONE BODY METABOLISM", C_AMBER),
bullet("Synthesis (<b>ketogenesis</b>): <b>Liver mitochondria ONLY</b>"),
bullet("Trigger: fasting/DKA β β OAA β acetyl CoA can't enter TCA β ketones"),
Spacer(1,2),
Paragraph("<b>Ketogenesis Steps:</b>", BOLD),
sub_bullet("Acetoacetyl CoA β <b>HMG CoA</b> (mito. HMG CoA synthase = <b>rate-limiting</b>)"),
sub_bullet("HMG CoA β <b>Acetoacetate</b> + Acetyl CoA (HMG CoA lyase)"),
sub_bullet("Acetoacetate β <b>3-Hydroxybutyrate</b> (when NADH β; favored in DKA/fasting)"),
sub_bullet("Acetoacetate β <b>Acetone</b> (spontaneous decarboxylation; fruity breath)"),
Spacer(1,2),
bullet("<b>Liver CANNOT use ketone bodies</b> β lacks <b>thiophorase</b> (succinyl CoA transferase)"),
bullet("Peripheral tissues: 3-HB β acetoacetate β acetoacetyl CoA β 2 Acetyl CoA β TCA"),
bullet("<b>DKA</b>: No insulin β massive lipolysis β βFA oxidation β βketones β acidosis"),
bullet("Brain uses ketones during prolonged fasting (after ~3β4 days)"),
]
s3_right = [
section_header("4 Β· CHOLESTEROL SYNTHESIS", C_GREEN),
bullet("All 27 carbons from <b>Acetyl CoA</b> | Location: <b>Cytosol/ER</b>"),
Spacer(1,2),
Paragraph("<b>Rate-limiting: HMG CoA β Mevalonate</b> (HMG CoA Reductase)", BOLD),
make_table(["HMG CoA Reductase",""],
[["Inhibited by","Statins, Cholesterol (feedback), Glucagon, AMPK"],
["Activated by","Insulin, Thyroid hormone"],
["Timing","Peaks at midnight β give statins at night"]],
[W*0.38*0.51, W*0.62*0.51], C_GREEN),
Spacer(1,3),
bullet("Mevalonate β IPP β Farnesyl PP β <b>Squalene</b> β <b>Cholesterol</b>"),
bullet("Farnesyl PP also β <b>CoQ10, Dolichol, Ras proteins</b>"),
sub_bullet("CoQ10 depletion = statin myopathy"),
bullet("<b>SREBP</b>: β LDL receptors + HMG CoA reductase when cholesterol low"),
bullet("<b>ACAT</b>: intracellular esterification | <b>LCAT</b>: on HDL (activated by Apo A-I)"),
bullet("Bile acid rate-limiting: <b>7Ξ±-hydroxylase</b>; Primary: cholic + chenodeoxycholic"),
bullet("95% bile acids reabsorbed: <b>terminal ileum</b> (enterohepatic circulation)"),
]
story.append(two_col(s3_left, s3_right, (0.49, 0.51)))
story.append(Spacer(1, 5))
# βββ SECTION 5: LIPOPROTEINS βββββββββββββββββββββββββββββββββββββββββββββββββ
story.append(section_header("5 Β· LIPOPROTEINS & TRANSPORT", C_NAVY))
story.append(Spacer(1, 3))
lp_left = [
make_table(
["Lipoprotein", "Source", "Key Apo", "Main Lipid", "Function"],
[
["Chylomicron", "Intestine", "Apo B-48", "Dietary TAG", "Dietary fat β tissues; enters lymph"],
["VLDL", "Liver", "Apo B-100", "Endogenous TAG","Liver TAG β periphery"],
["IDL", "From VLDL", "Apo B-100, E", "TAG+Chol", "Intermediate; β LDL"],
["LDL", "From IDL", "Apo B-100", "Cholesterol", "Chol β tissues (atherogenic)"],
["HDL", "Liver/Gut", "Apo A-I", "Protein-rich", "Reverse cholesterol transport"],
],
[W*0.13, W*0.12, W*0.15, W*0.17, W*0.43],
C_NAVY
),
Spacer(1,4),
bullet("<b>LPL</b> (Lipoprotein Lipase): on capillary endothelium; activated by <b>Apo C-II</b>; hydrolyzes TAG"),
bullet("<b>Chylomicron remnants</b> (not intact chylomicrons) taken up by liver via <b>Apo E receptor</b>"),
bullet("<b>CETP</b>: transfers cholesterol esters from HDL β LDL/VLDL"),
bullet("<b>ABCA1</b>: cholesterol efflux from cells β HDL; defective in <b>Tangier disease</b> (ββ HDL)"),
]
story.extend(lp_left)
story.append(Spacer(1, 5))
# βββ SECTION 6+7: DISORDERS + HORMONES βββββββββββββββββββββββββββββββββββββββ
s6_left = [
section_header("6 Β· LIPOLYSIS (Adipose Tissue)", C_TEAL),
bullet("<b>ATGL</b>: TAG β DAG (initiates)"),
bullet("<b>HSL</b> (Hormone-Sensitive Lipase): rate-limiting; DAG β MAG"),
sub_bullet("Activated: glucagon, epinephrine (cAMP β PKA)"),
sub_bullet("Inhibited: <b>insulin</b>"),
bullet("Released: FFA β albumin β liver/muscle; Glycerol β liver (gluconeogenesis)"),
bullet("<b>Adipose lacks glycerol kinase</b> β needs glucose for glycerol-3-P"),
Spacer(1,4),
section_header("7 Β· HORMONAL REGULATION", C_PURPLE),
make_table(["Hormone","FA Synthesis","Lipolysis","Ketogenesis"],
[["Insulin","β (activates ACC)","β (inhibits HSL)","β"],
["Glucagon","β (inhibits ACC)","β","β"],
["Epinephrine","β","ββ","β"],
["Cortisol","β","β","β"],
["T3/T4","β","β","β LDL receptors"]],
[W*0.49*0.3, W*0.49*0.24, W*0.49*0.23, W*0.49*0.23],
C_PURPLE),
]
s6_right = [
section_header("8 Β· DISORDERS", C_WARN),
make_table(["Disease","Defect","Key Feature"],
[["Fam. Hypercholesterolemia","LDL receptor","Very β LDL, xanthomas, early MI"],
["Type I Hyperlipidemia","LPL or Apo C-II","Milky plasma, pancreatitis, no βCVD"],
["Type III (Dysbetalipoprotein.)","Apo E2/E2","β IDL, palmar xanthomas"],
["MCAD deficiency","Medium-chain acyl CoA DH","Hypo<b>keto</b>tic hypoglycemia (C8)"],
["Abetalipoproteinemia","No Apo B","Fat malabsorb, acanthocytes, ataxia"],
["Zellweger syndrome","Peroxisome biogenesis","VLCFA β, neonatal hypotonia"],
["Tangier disease","ABCA1 mutation","Very β HDL, cholesterol in tonsils"]],
[W*0.51*0.32, W*0.51*0.28, W*0.51*0.4],
C_WARN),
Spacer(1,4),
section_header("9 Β· SPHINGOLIPIDOSES", C_GREEN),
make_table(["Disease","Enzyme","Accumulates"],
[["Gaucher","Glucocerebrosidase","Glucocerebroside"],
["Niemann-Pick","Sphingomyelinase","Sphingomyelin"],
["Tay-Sachs","Hexosaminidase A","GM2 ganglioside"],
["Fabry","Ξ±-Galactosidase A","Ceramide trihexoside"],
["Krabbe","Galactocerebrosidase","Galactocerebroside"]],
[W*0.51*0.33, W*0.51*0.37, W*0.51*0.3],
C_GREEN),
]
story.append(two_col(s6_left, s6_right, (0.49, 0.51)))
story.append(Spacer(1, 5))
# βββ SECTION 10: KEY ENZYMES βββββββββββββββββββββββββββββββββββββββββββββββββ
story.append(section_header("10 Β· KEY ENZYMES & COFACTORS", C_NAVY))
story.append(Spacer(1, 3))
story.append(make_table(
["Enzyme","Cofactor","Rate-Limiting For","Location"],
[
["Acetyl CoA Carboxylase (ACC)","Biotin","FA Synthesis","Cytosol"],
["Fatty Acid Synthase (FAS)","NADPH","FA chain elongation","Cytosol"],
["HMG CoA Reductase","NADPH","Cholesterol synthesis","ER"],
["Mito. HMG CoA Synthase","β","Ketogenesis","Mitochondria (liver)"],
["7Ξ±-Hydroxylase","β","Bile acid synthesis","ER (liver)"],
["Lipoprotein Lipase (LPL)","Apo C-II (activator)","TAG hydrolysis","Capillary endothelium"],
["Pyruvate Carboxylase","Biotin","Gluconeogenesis/OAA","Mitochondria"],
["Propionyl CoA Carboxylase","Biotin","Odd-chain FA metabolism","Mitochondria"],
["Methylmalonyl CoA Mutase","Vitamin B12","Odd-chain FA β TCA","Mitochondria"],
["Hormone-Sensitive Lipase (HSL)","β","Adipose lipolysis","Adipose cytoplasm"],
["LCAT","β","Cholesterol esterification on HDL","Plasma (on HDL)"],
["ACAT","β","Intracellular cholesterol storage","ER"],
],
[W*0.27, W*0.16, W*0.3, W*0.27],
C_NAVY
))
story.append(Spacer(1, 5))
# βββ MCQ TRAPS BOX βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
story.append(section_header("β TOP MCQ TRAPS β Memorize These!", C_WARN))
story.append(Spacer(1, 3))
traps = [
["1","Malonyl CoA inhibits CPT-I β fed state: FA synthesis & oxidation don't run simultaneously"],
["2","Liver CANNOT use ketone bodies β lacks thiophorase (succinyl CoA:acetoacetate CoA transferase)"],
["3","Adipose lacks glycerol kinase β cannot recycle glycerol; needs glucose for glycerol-3-P"],
["4","Chylomicron REMNANTS (not intact chylomicrons) are taken up by liver via Apo E"],
["5","HMG CoA exists in both mitochondria (ketogenesis) & cytosol (cholesterol) β different pools!"],
["6","Biotin deficiency β impairs ACC, pyruvate carboxylase, propionyl CoA carboxylase (3 enzymes)"],
["7","B12 deficiency β methylmalonic acidemia; does NOT affect FA synthesis"],
["8","Odd-chain FA only β contributes to gluconeogenesis (via propionyl CoA β succinyl CoA)"],
["9","MCAD deficiency β HYPOketotic hypoglycemia (cannot oxidize FA, so no ketones)"],
["10","Chylomicrons enter lymph (thoracic duct); short-chain FA enter portal blood directly"],
["11","Statins given at night β HMG CoA reductase activity peaks at midnight"],
["12","Ezetimibe blocks NPC1L1 (intestinal absorption); cholestyramine blocks ileal reabsorption"],
["13","3-Hydroxybutyrate predominates over acetoacetate when NADH is high (fasting/DKA)"],
["14","Acetone is NOT metabolized β detected in breath; biologically inert"],
["15","LCAT is activated by Apo A-I; LPL is activated by Apo C-II"],
]
trap_tbl = Table(
[[Paragraph(f"<b>{r[0]}.</b>", S("tn", fontName="Helvetica-Bold", fontSize=8,
textColor=C_WARN, alignment=TA_CENTER)),
Paragraph(r[1], S("tt", fontName="Helvetica", fontSize=7.5,
textColor=C_BLACK, leading=11))]
for r in traps],
colWidths=[W*0.05, W*0.95]
)
trap_tbl.setStyle(TableStyle([
("ROWBACKGROUNDS", (0,0),(-1,-1), [C_WHITE, C_LGRAY]),
("GRID", (0,0),(-1,-1), 0.3, C_MGRAY),
("TOPPADDING", (0,0),(-1,-1), 3),
("BOTTOMPADDING", (0,0),(-1,-1), 3),
("LEFTPADDING", (0,0),(-1,-1), 5),
("VALIGN", (0,0),(-1,-1), "MIDDLE"),
("LINEAFTER", (0,0),(0,-1), 1, C_WARN),
]))
story.append(trap_tbl)
story.append(Spacer(1, 5))
# βββ COMPARTMENTALIZATION QUICK TABLE ββββββββββββββββββββββββββββββββββββββββ
story.append(section_header("11 Β· COMPARTMENTALIZATION AT A GLANCE", C_NAVY))
story.append(Spacer(1, 3))
comp_left = make_table(
["Process","Location"],
[["Ξ²-Oxidation (LCFA)","Mitochondria"],
["Ξ²-Oxidation (VLCFA)","Peroxisomes"],
["FA Synthesis","Cytosol"],
["Cholesterol Synthesis","Cytosol/ER"],
["Ketogenesis","Mitochondria (liver)"],
["FA Elongation","ER"],
["FA Desaturation","ER"],
["TAG Synthesis","ER"],
["LPL action","Capillary endothelium"],
["LCAT action","Plasma (on HDL)"]],
[W*0.5*0.55, W*0.5*0.45],
C_NAVY
)
eicosanoid = make_table(
["Eicosanoid","Enzyme","Source","Action"],
[["PGIβ (Prostacyclin)","COX","Endothelium","Vasodilate, β aggregation"],
["TXAβ (Thromboxane)","COX","Platelets","Vasoconstrict, β aggregation"],
["LTB4","Lipoxygenase","Neutrophils","Chemotaxis"],
["LTC4/D4/E4","Lipoxygenase","Mast cells","Bronchoconstriction (asthma)"]],
[W*0.5*0.25, W*0.5*0.22, W*0.5*0.22, W*0.5*0.31],
C_TEAL
)
comp_block = [
comp_left,
]
eico_block = [
section_header("12 Β· EICOSANOIDS", C_TEAL),
Spacer(1,3),
eicosanoid,
Spacer(1,3),
bullet("From: <b>Arachidonic acid</b> (C20:4, Ο-6)"),
bullet("<b>Aspirin</b>: irreversibly inhibits COX β β TXAβ (antiplatelet) + β PGIβ"),
bullet("NSAIDs: reversibly inhibit COX"),
]
story.append(two_col(comp_block, eico_block, (0.49, 0.51)))
# βββ FOOTER ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
story.append(Spacer(1, 6))
story.append(HRFlowable(width=W, thickness=0.5, color=C_MGRAY))
story.append(Spacer(1, 3))
story.append(Paragraph(
"Sources: Lippincott Illustrated Reviews Biochemistry 8e (Chapters 16β18) Β· Guyton & Hall Medical Physiology Β· Generated by Orris",
S("ft", fontName="Helvetica", fontSize=6.5, textColor=colors.grey, alignment=TA_CENTER)
))
# βββ BUILD ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
doc.build(story)
print(f"PDF saved to: {OUTPUT}")