Wolf kishner Reduction reaction explain the Mechanism of Reaction and Application
Wolff-Kishner reduction mechanism reaction steps application chemistry
https://en.wikipedia.org/wiki/Wolff%E2%80%93Kishner_reductio…
R₁-CO-R₂ → R₁-CH₂-R₂
R₁-CO-R₂ + NH₂-NH₂ → R₁-C(OH)(NH-NH₂)-R₂
R₁-C(OH)(NH-NH₂)-R₂ → R₁R₂C=N-NH₂ + H₂O
R₁R₂C=N-NH₂ + OH⁻ → R₁R₂C=N-NH⁻ + H₂O
R₁R₂C=N-NH⁻ ⟷ R₁R₂C⁻-N=NH
R₁R₂C⁻-N=NH + H-solvent → R₁R₂CH-N=NH
R₁R₂CH-N=NH + OH⁻ → R₁R₂CH-N=N⁻
R₁R₂CH-N=N⁻ → R₁R₂CH⁻ + N₂↑
R₁R₂CH⁻ + H-solvent → R₁R₂CH₂
| Stage | Step | What Happens |
|---|---|---|
| 1 | 1 | NH₂NH₂ attacks C=O |
| 1 | 2 | Proton transfer |
| 1 | 3 | -OH eliminated as water |
| 1 | 4 | Deprotonation → hydrazone |
| 2 | 1 | Base deprotonates -NH₂ (RDS) |
| 2 | 2 | Charge delocalizes to C |
| 2 | 3 | Carbon protonated by solvent |
| 2 | 4 | N-H deprotonated |
| 2 | 5 | N₂ expelled |
| 2 | 6 | Carbanion protonated → alkane |
| Component | Role |
|---|---|
| Hydrazine (NH₂NH₂) | Reducing agent / forms hydrazone |
| KOH (strong base) | Deprotonates hydrazone (RDS) |
| Ethylene glycol | High-boiling solvent (~197°C) |
| Heat (~180-200°C) | Overcomes activation energy |
| N₂ gas (byproduct) | Thermodynamic driving force |
C₆H₅-CO-CH₃ → C₆H₅-CH₂-CH₃
| Feature | Wolff-Kishner | Clemmensen |
|---|---|---|
| Reagents | NH₂NH₂, KOH, heat | Zn(Hg), conc. HCl |
| Conditions | Strongly basic, high temp | Strongly acidic |
| Substrate preference | Acid-sensitive compounds | Base-sensitive compounds |
| Mechanism | Via hydrazone anion | Via organozinc intermediate |
| Solvent | Ethylene glycol | Aqueous HCl |
Generate a detailed PDF summary of Wolff-Kishner mechanism and synthetic applications
ls -la /home/daytona/workspace/ 2>/dev/null || echo "workspace not found"
mkdir -p /home/daytona/workspace/wolff-kishner-pdf
~/wolff-kishner-pdf/generate_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, KeepTogether, PageBreak
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import Flowable
from reportlab.pdfgen import canvas
import os
OUTPUT_PATH = "/home/daytona/workspace/wolff-kishner-pdf/Wolff_Kishner_Reduction.pdf"
# ── Custom colours ──────────────────────────────────────────────────────────
DARK_BLUE = colors.HexColor("#1A3A5C")
MED_BLUE = colors.HexColor("#2E6DA4")
LIGHT_BLUE = colors.HexColor("#D6E8FA")
ACCENT = colors.HexColor("#E8A020")
LIGHT_GREY = colors.HexColor("#F4F6F8")
MID_GREY = colors.HexColor("#8A9BB0")
GREEN = colors.HexColor("#1A7A4A")
LIGHT_GREEN = colors.HexColor("#D4EDDA")
RED_DARK = colors.HexColor("#8B1A1A")
LIGHT_RED = colors.HexColor("#FDECEA")
WHITE = colors.white
BLACK = colors.black
# ── Page template with header/footer ────────────────────────────────────────
class NumberedCanvas(canvas.Canvas):
def __init__(self, *args, **kwargs):
canvas.Canvas.__init__(self, *args, **kwargs)
self._saved_page_states = []
def showPage(self):
self._saved_page_states.append(dict(self.__dict__))
self._startPage()
def save(self):
num_pages = len(self._saved_page_states)
for state in self._saved_page_states:
self.__dict__.update(state)
self.draw_page_number(num_pages)
canvas.Canvas.showPage(self)
canvas.Canvas.save(self)
def draw_page_number(self, page_count):
page_num = self._pageNumber
W, H = A4
# Header bar
self.setFillColor(DARK_BLUE)
self.rect(0, H - 28*mm, W, 28*mm, fill=1, stroke=0)
self.setFillColor(ACCENT)
self.rect(0, H - 31*mm, W, 3*mm, fill=1, stroke=0)
self.setFillColor(WHITE)
self.setFont("Helvetica-Bold", 13)
self.drawString(20*mm, H - 18*mm, "Wolff-Kishner Reduction")
self.setFont("Helvetica", 9)
self.drawRightString(W - 20*mm, H - 18*mm, "Organic Chemistry Reference")
# Footer
self.setFillColor(DARK_BLUE)
self.rect(0, 0, W, 14*mm, fill=1, stroke=0)
self.setFillColor(ACCENT)
self.rect(0, 14*mm, W, 1.5*mm, fill=1, stroke=0)
self.setFillColor(WHITE)
self.setFont("Helvetica", 8)
self.drawString(20*mm, 5*mm, "Mechanism · Modifications · Synthetic Applications")
self.drawRightString(W - 20*mm, 5*mm, f"Page {page_num} of {page_count}")
def build_styles():
base = getSampleStyleSheet()
title = ParagraphStyle("DocTitle",
fontSize=22, fontName="Helvetica-Bold",
textColor=WHITE, alignment=TA_CENTER,
spaceAfter=4)
subtitle = ParagraphStyle("DocSubtitle",
fontSize=12, fontName="Helvetica",
textColor=LIGHT_BLUE, alignment=TA_CENTER,
spaceAfter=2)
section = ParagraphStyle("Section",
fontSize=14, fontName="Helvetica-Bold",
textColor=WHITE, alignment=TA_LEFT,
spaceBefore=14, spaceAfter=6,
leftIndent=0, borderPad=6,
backColor=DARK_BLUE)
subsection = ParagraphStyle("Subsection",
fontSize=11, fontName="Helvetica-Bold",
textColor=DARK_BLUE, spaceBefore=10, spaceAfter=4)
body = ParagraphStyle("Body",
fontSize=9.5, fontName="Helvetica",
textColor=BLACK, leading=15,
spaceAfter=6, alignment=TA_JUSTIFY)
bullet = ParagraphStyle("Bullet",
fontSize=9.5, fontName="Helvetica",
textColor=BLACK, leading=15,
spaceAfter=4, leftIndent=16, bulletIndent=4,
alignment=TA_LEFT)
code = ParagraphStyle("Code",
fontSize=9, fontName="Courier",
textColor=DARK_BLUE, backColor=LIGHT_GREY,
leading=14, leftIndent=12, rightIndent=12,
spaceAfter=6, borderPad=4)
note = ParagraphStyle("Note",
fontSize=9, fontName="Helvetica-Oblique",
textColor=GREEN, leading=13,
leftIndent=12, spaceAfter=6)
caption = ParagraphStyle("Caption",
fontSize=8.5, fontName="Helvetica-Oblique",
textColor=MID_GREY, alignment=TA_CENTER, spaceAfter=8)
highlight = ParagraphStyle("Highlight",
fontSize=9.5, fontName="Helvetica",
textColor=BLACK, backColor=LIGHT_BLUE,
leading=15, leftIndent=10, rightIndent=10,
spaceAfter=6, borderPad=6)
return dict(title=title, subtitle=subtitle, section=section,
subsection=subsection, body=body, bullet=bullet,
code=code, note=note, caption=caption, highlight=highlight)
def section_header(text, s):
return [
Spacer(1, 6),
Table([[Paragraph(f" {text}", s["section"])]],
colWidths=["100%"],
style=TableStyle([
("BACKGROUND", (0,0), (-1,-1), DARK_BLUE),
("TOPPADDING", (0,0), (-1,-1), 8),
("BOTTOMPADDING", (0,0), (-1,-1), 8),
("LEFTPADDING", (0,0), (-1,-1), 10),
])),
Spacer(1, 6),
]
def step_table(steps, s):
"""Numbered step table with alternating row colours."""
data = [["Step", "Action", "Description"]]
for i, (action, desc) in enumerate(steps, 1):
data.append([str(i), action, desc])
ts = TableStyle([
("BACKGROUND", (0,0), (-1,0), DARK_BLUE),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,0), 9),
("ALIGN", (0,0), (-1,-1), "LEFT"),
("VALIGN", (0,0), (-1,-1), "TOP"),
("FONTNAME", (0,1), (-1,-1), "Helvetica"),
("FONTSIZE", (0,1), (-1,-1), 8.5),
("ROWBACKGROUNDS",(0,1), (-1,-1), [WHITE, LIGHT_GREY]),
("GRID", (0,0), (-1,-1), 0.4, MID_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),
])
return Table(data, colWidths=[1.2*cm, 4.5*cm, 12*cm], style=ts)
def two_col_table(left_data, right_data, headers, s):
"""Generic two-column comparison table."""
data = [headers]
for l, r in zip(left_data, right_data):
data.append([l, r])
ts = TableStyle([
("BACKGROUND", (0,0), (-1,0), MED_BLUE),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,0), 9),
("ALIGN", (0,0), (-1,-1), "LEFT"),
("VALIGN", (0,0), (-1,-1), "TOP"),
("FONTNAME", (0,1), (-1,-1), "Helvetica"),
("FONTSIZE", (0,1), (-1,-1), 8.5),
("ROWBACKGROUNDS",(0,1), (-1,-1), [WHITE, LIGHT_GREY]),
("GRID", (0,0), (-1,-1), 0.4, MID_GREY),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
])
return Table(data, colWidths=["50%","50%"], style=ts)
def comparison_table(rows, s):
"""Wolff-Kishner vs Clemmensen comparison."""
headers = [
Paragraph("<b>Feature</b>", ParagraphStyle("th", fontSize=9, fontName="Helvetica-Bold", textColor=WHITE)),
Paragraph("<b>Wolff-Kishner</b>", ParagraphStyle("th", fontSize=9, fontName="Helvetica-Bold", textColor=WHITE)),
Paragraph("<b>Clemmensen</b>", ParagraphStyle("th", fontSize=9, fontName="Helvetica-Bold", textColor=WHITE)),
]
data = [headers] + rows
ts = TableStyle([
("BACKGROUND", (0,0), (-1,0), DARK_BLUE),
("BACKGROUND", (0,1), (0,-1), LIGHT_BLUE),
("FONTNAME", (0,1), (0,-1), "Helvetica-Bold"),
("FONTSIZE", (0,1), (0,-1), 8.5),
("ALIGN", (0,0), (-1,-1), "LEFT"),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("FONTNAME", (1,1), (-1,-1), "Helvetica"),
("FONTSIZE", (1,1), (-1,-1), 8.5),
("ROWBACKGROUNDS",(1,1), (-1,-1), [WHITE, LIGHT_GREY]),
("GRID", (0,0), (-1,-1), 0.4, MID_GREY),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
])
return Table(data, colWidths=[4.5*cm, 8.5*cm, 8.5*cm], style=ts)
def info_box(text, s, bg=LIGHT_BLUE, border=MED_BLUE):
inner = Table([[Paragraph(text, s["body"])]], colWidths=["100%"],
style=TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("LINEAFTER", (0,0), (0,-1), 2, border),
("LINEBEFORE", (0,0), (0,-1), 2, border),
("TOPPADDING", (0,0), (-1,-1), 8),
("BOTTOMPADDING", (0,0), (-1,-1), 8),
("LEFTPADDING", (0,0), (-1,-1), 12),
]))
return inner
def reaction_box(text, s):
return Table([[Paragraph(text, s["code"])]], colWidths=["100%"],
style=TableStyle([
("BACKGROUND", (0,0), (-1,-1), LIGHT_GREY),
("BOX", (0,0), (-1,-1), 1, MED_BLUE),
("TOPPADDING", (0,0), (-1,-1), 8),
("BOTTOMPADDING", (0,0), (-1,-1), 8),
("LEFTPADDING", (0,0), (-1,-1), 12),
]))
# ════════════════════════════════════════════════════════════════════════════
# DOCUMENT ASSEMBLY
# ════════════════════════════════════════════════════════════════════════════
def build():
doc = SimpleDocTemplate(
OUTPUT_PATH,
pagesize=A4,
leftMargin=2*cm, rightMargin=2*cm,
topMargin=3.5*cm, bottomMargin=2.5*cm,
title="Wolff-Kishner Reduction – Mechanism & Synthetic Applications",
author="Orris Chemistry Reference",
subject="Organic Chemistry – Carbonyl Reduction"
)
s = build_styles()
story = []
W = A4[0] - 4*cm # usable width
# ── Cover block ──────────────────────────────────────────────────────────
cover = Table([
[Paragraph("Wolff-Kishner Reduction", s["title"])],
[Paragraph("Mechanism, Modifications & Synthetic Applications", s["subtitle"])],
[Paragraph("Organic Chemistry Reference Summary", s["subtitle"])],
], colWidths=[W],
style=TableStyle([
("BACKGROUND", (0,0), (-1,-1), DARK_BLUE),
("TOPPADDING", (0,0), (-1,-1), 14),
("BOTTOMPADDING", (0,0), (-1,-1), 10),
("LEFTPADDING", (0,0), (-1,-1), 16),
("RIGHTPADDING", (0,0), (-1,-1), 16),
("LINEBELOW", (0,-1), (-1,-1), 4, ACCENT),
]))
story.append(cover)
story.append(Spacer(1, 12))
# ── Quick-reference overview boxes ───────────────────────────────────────
overview_data = [
[Paragraph("<b>Discovered</b>", s["body"]),
Paragraph("N. Kishner (1911) & L. Wolff (1912)", s["body"])],
[Paragraph("<b>Overall Transformation</b>", s["body"]),
Paragraph("C=O (aldehyde/ketone) → CH₂ (methylene/alkane)", s["body"])],
[Paragraph("<b>Key Reagents</b>", s["body"]),
Paragraph("NH₂NH₂ (hydrazine), KOH, ethylene glycol, heat (~200 °C)", s["body"])],
[Paragraph("<b>Driving Force</b>", s["body"]),
Paragraph("Formation of N₂ gas (bond energy ≈ 945 kJ/mol)", s["body"])],
[Paragraph("<b>Mechanism Type</b>", s["body"]),
Paragraph("Two-stage: hydrazone formation → base-mediated deoxygenation", s["body"])],
[Paragraph("<b>Selectivity</b>", s["body"]),
Paragraph("Specific for C=O groups; requires basic conditions", s["body"])],
]
overview_t = Table(overview_data, colWidths=[4.5*cm, W-4.5*cm],
style=TableStyle([
("BACKGROUND", (0,0), (0,-1), LIGHT_BLUE),
("FONTNAME", (0,0), (0,-1), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 9),
("GRID", (0,0), (-1,-1), 0.4, MID_GREY),
("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(overview_t)
story.append(Spacer(1, 10))
# ── Overall reaction equation ─────────────────────────────────────────────
story += section_header("1. Overall Reaction", s)
story.append(Paragraph(
"The Wolff-Kishner reduction converts <b>aldehydes and ketones into alkanes</b> by replacing "
"the carbonyl oxygen with two hydrogen atoms. The nitrogen of hydrazine is expelled as N₂ gas, "
"providing the thermodynamic driving force.", s["body"]))
rxn = reaction_box(
"Aldehyde/Ketone + NH₂NH₂ → Hydrazone → Alkane + N₂↑ + H₂O\n\n"
"R₁-CO-R₂ + NH₂NH₂ ──[KOH, EG, Δ]──► R₁-CH₂-R₂ + N₂ + H₂O\n\n"
"Example: C₆H₅-CO-CH₃ ──► C₆H₅-CH₂-CH₃ (acetophenone → ethylbenzene)", s)
story.append(rxn)
story.append(Spacer(1, 6))
# Conditions table
cond_data = [
[Paragraph("<b>Reagent / Condition</b>", s["body"]),
Paragraph("<b>Role</b>", s["body"]),
Paragraph("<b>Notes</b>", s["body"])],
["Hydrazine (NH₂NH₂)", "Reducing agent; forms hydrazone", "H-N pKa ≈ 21; acts as nucleophile"],
["KOH (strong base)", "Deprotonates hydrazone NH₂ (RDS)", "Alkoxide of ethylene glycol is actual base"],
["Ethylene glycol (EG)", "High-boiling protic solvent", "bp 197 °C; enables reaction at ~200 °C"],
["Heat (~180–200 °C)", "Overcomes activation energy of RDS", "Huang Minlon mod. runs at same temp"],
["N₂ gas (byproduct)", "Thermodynamic driving force", "Bond energy 945 kJ/mol makes irreversible"],
]
cond_t = Table(cond_data, colWidths=[4.5*cm, 6.5*cm, 7*cm],
style=TableStyle([
("BACKGROUND", (0,0), (-1,0), MED_BLUE),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTNAME", (0,1), (-1,-1), "Helvetica"),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("ROWBACKGROUNDS",(0,1), (-1,-1), [WHITE, LIGHT_GREY]),
("GRID", (0,0), (-1,-1), 0.4, MID_GREY),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(cond_t)
story.append(Spacer(1, 8))
# ── MECHANISM ─────────────────────────────────────────────────────────────
story += section_header("2. Detailed Mechanism", s)
# Stage 1
story.append(Paragraph("Stage 1 – Formation of the Hydrazone", s["subsection"]))
story.append(Paragraph(
"Hydrazine reacts with the carbonyl compound through nucleophilic addition-elimination "
"(analogous to imine formation). This stage proceeds in four steps:", s["body"]))
stage1_steps = [
("Nucleophilic Addition",
"The terminal –NH₂ of hydrazine attacks the electrophilic carbonyl carbon (C=O). "
"A tetrahedral carbinolamine intermediate forms: R₁R₂C(OH)(NH-NH₂)."),
("Proton Transfer",
"An internal proton transfer occurs within the tetrahedral intermediate, "
"redistributing the proton between oxygen and nitrogen atoms."),
("Elimination of Water",
"The –OH group departs as water under the basic/thermal conditions, "
"forming an iminium ion. Loss of H₂O is driven by the formation of C=N."),
("Deprotonation → Hydrazone",
"The terminal –NH₂ nitrogen loses a proton to base, giving the neutral hydrazone "
"(R₁R₂C=N–NH₂). This completes Stage 1."),
]
story.append(step_table(stage1_steps, s))
story.append(Spacer(1, 4))
story.append(reaction_box(
"Stage 1 Overall:\n"
"R₁-CO-R₂ + NH₂-NH₂ → R₁R₂C=N-NH₂ + H₂O\n"
" (hydrazone)", s))
story.append(Spacer(1, 8))
# Stage 2
story.append(Paragraph("Stage 2 – Reduction of Hydrazone to Alkane", s["subsection"]))
story.append(Paragraph(
"The hydrazone undergoes base-mediated deoxygenation through a series of deprotonation, "
"resonance delocalization, protonation, and N₂ expulsion steps:", s["body"]))
stage2_steps = [
("Deprotonation of –NH₂ ★RDS",
"Strong base (KOH / glycol alkoxide) removes a proton from the –NH₂ terminus of the "
"hydrazone, generating a hydrazone anion: R₁R₂C=N–NH⁻. "
"This is the RATE-DETERMINING STEP (first order in OH⁻ and in hydrazone; confirmed by Szmant, 1964)."),
("Resonance Delocalization",
"The negative charge delocalizes from nitrogen to carbon via the C=N π system: "
"R₁R₂C=N–NH⁻ ⟷ R₁R₂C⁻–N=NH (carbanion resonance contributor)."),
("Protonation at Carbon (concerted)",
"Solvent (ethylene glycol or water) donates a proton to the carbanion carbon "
"in a concerted step with abstraction of the N–H proton: "
"R₁R₂C⁻–N=NH + H-solvent → R₁R₂CH–N=NH."),
("Second Deprotonation",
"Base removes the remaining N–H proton to give a diazene anion: "
"R₁R₂CH–N=NH + OH⁻ → R₁R₂CH–N=N⁻ + H₂O."),
("Expulsion of N₂",
"The diazene anion collapses, expelling nitrogen gas and generating a carbanion: "
"R₁R₂CH–N=N⁻ → R₁R₂CH⁻ + N₂↑. "
"Thermodynamic irreversibility: N≡N bond energy ≈ 945 kJ/mol."),
("Final Protonation → Alkane",
"The carbanion is immediately protonated by the protic solvent to yield the final "
"alkane product: R₁R₂CH⁻ + H-solvent → R₁R₂CH₂."),
]
story.append(step_table(stage2_steps, s))
story.append(Spacer(1, 4))
story.append(reaction_box(
"Stage 2 Overall:\n"
"R₁R₂C=N-NH₂ ──[KOH, Δ]──► R₁R₂CH₂ + N₂↑\n\n"
"Rate Law: v = k [hydrazone][OH⁻] (Szmant, J. Am. Chem. Soc. 1964)", s))
story.append(Spacer(1, 4))
story.append(info_box(
"<b>Key Mechanistic Insight (Szmant, 1964):</b> The rate-determining step is NOT the initial "
"addition of hydrazine but rather the <b>deprotonation of the hydrazone NH₂</b> by base. "
"The subsequent C–H bond formation at the carbanion carbon occurs in a <b>concerted, "
"solvent-mediated protonation/deprotonation</b> step. The reaction is first order in both "
"[OH⁻] and [hydrazone], consistent with this mechanism.", s))
story.append(Spacer(1, 6))
# ── MODIFICATIONS ─────────────────────────────────────────────────────────
story += section_header("3. Important Modifications", s)
mods = [
("Huang Minlon Modification (1946)",
MED_BLUE, LIGHT_BLUE,
"The most widely adopted modification. The aldehyde/ketone, hydrazine, and KOH are heated "
"together in ethylene glycol in a <b>one-pot procedure</b>. After hydrazone formation, excess "
"water and hydrazine are distilled off before the final high-temperature heating step. "
"<b>Advantages:</b> simplified one-pot operation, improved yields (especially hindered ketones), "
"significantly reduced reaction times. Widely used in steroid chemistry and total synthesis."),
("Bamford-Stevens Reaction",
GREEN, LIGHT_GREEN,
"Tosylhydrazones (from p-TsNHNH₂) replace hydrazine. Under <b>basic conditions</b>, the tosylhydrazone "
"decomposes to give an <b>alkene</b> (via vinyl carbanion / carbene pathway) rather than an alkane. "
"Under <b>acidic conditions</b>, carbocations form (useful for skeletal rearrangements). "
"Useful when a double bond is the target rather than full deoxygenation."),
("Caglioti Modification",
RED_DARK, LIGHT_RED,
"Uses <b>tosylhydrazone sodium salts</b>. Milder conditions than the classical Wolff-Kishner "
"(some substrates react at lower temperatures). Particularly useful for acid- or base-sensitive "
"molecules where the standard harsh conditions would be destructive."),
("Pre-formed Hydrazone Method",
colors.HexColor("#5A3A7A"), colors.HexColor("#EDE8F5"),
"When the aldehyde/ketone is particularly reactive or sensitive, the hydrazone is prepared "
"separately under mild conditions and then subjected to the basic decomposition step independently. "
"This two-step approach offers better control over each stage."),
]
for title_text, title_col, bg_col, body_text in mods:
mod_t = Table([
[Paragraph(f"<b>{title_text}</b>",
ParagraphStyle("modtitle", fontSize=10, fontName="Helvetica-Bold",
textColor=WHITE))],
[Paragraph(body_text, s["body"])],
], colWidths=[W],
style=TableStyle([
("BACKGROUND", (0,0), (-1,0), title_col),
("BACKGROUND", (0,1), (-1,-1), bg_col),
("TOPPADDING", (0,0), (-1,-1), 7),
("BOTTOMPADDING", (0,0), (-1,-1), 7),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 10),
("BOX", (0,0), (-1,-1), 0.5, title_col),
]))
story.append(mod_t)
story.append(Spacer(1, 6))
# ── APPLICATIONS ──────────────────────────────────────────────────────────
story += section_header("4. Synthetic Applications", s)
story.append(Paragraph(
"The Wolff-Kishner reduction is valued in synthesis wherever a carbonyl group needs to be "
"removed after serving its role as a directing or activating group in prior steps.", s["body"]))
story.append(Spacer(1, 4))
apps = [
["1", "Deoxygenation of Carbonyls",
"Primary application: remove a ketone/aldehyde after it has served its synthetic purpose "
"(e.g., as an activating group for electrophilic aromatic substitution or an aldol reaction)."],
["2", "Synthesis of Alkylbenzenes\n(Haworth synthesis)",
"Combine Friedel-Crafts acylation with Wolff-Kishner reduction:\n"
"ArH → [FrCrafts acylation] → Ar-CO-R → [WK reduction] → Ar-CH₂-R\n"
"This avoids carbocation rearrangements inherent in direct Friedel-Crafts alkylation. "
"Key step in Haworth synthesis of naphthalene derivatives."],
["3", "Steroid Synthesis",
"Reduction of steroidal ketones to CH₂ groups. The Huang Minlon modification "
"is especially effective for hindered steroidal ketones where other methods fail."],
["4", "Polycyclic Aromatic Synthesis",
"Preparation of polycyclic aromatic hydrocarbons (PAHs) with unbranched "
"hydrocarbon side chains. Wolff-Kishner cleanly converts aryl ketones to "
"the corresponding alkyl-substituted aromatics."],
["5", "Total Synthesis of Natural Products",
"Applied in synthesis of: Scopadulcic acid B, Aspidospermidine (Huang Minlon "
"modification as a key late-stage step), Dysidiolide, sec-Credenol, and "
"various terpenoids and alkaloids."],
["6", "Large-Scale Industrial Synthesis",
"Scaled to kilogram quantities for synthesis of functionalized imidazole substrates "
"when alternative reduction methods (NaBH₄, DIBAL, etc.) all failed. Safety "
"protocols developed for large-scale N₂ evolution."],
["7", "Aliphatic & Mixed Carbonyl Reduction",
"Works on both aliphatic and aliphatic-aromatic carbonyl compounds, "
"including aldehydes (gives primary alkyl products) and ketones (gives secondary)."],
["8", "Antascomicin B Fragment Synthesis",
"An allylic diazene rearrangement approach was used for the C21-C34 fragment "
"synthesis. The hydrazone was selectively reduced with catecholborane, "
"demonstrating modern variants of Kishner-type chemistry."],
]
app_t = Table(
[[Paragraph(f"<b>{r[0]}</b>", s["body"]),
Paragraph(f"<b>{r[1]}</b>", s["body"]),
Paragraph(r[2], s["body"])] for r in apps],
colWidths=[0.8*cm, 5.2*cm, W - 6*cm],
style=TableStyle([
("BACKGROUND", (0,0), (1,-1), LIGHT_BLUE),
("FONTNAME", (0,0), (0,-1), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("ROWBACKGROUNDS",(2,0), (2,-1), [WHITE, LIGHT_GREY]),
("GRID", (0,0), (-1,-1), 0.4, MID_GREY),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(app_t)
story.append(Spacer(1, 8))
# Example reaction box
story.append(Paragraph("Representative Synthetic Sequence (Haworth Synthesis):", s["subsection"]))
story.append(reaction_box(
"Step 1 – Friedel-Crafts Acylation:\n"
" C₆H₆ + CH₃COCl ──[AlCl₃]──► C₆H₅-CO-CH₃ (acetophenone)\n\n"
"Step 2 – Wolff-Kishner Reduction:\n"
" C₆H₅-CO-CH₃ ──[NH₂NH₂, KOH, EG, 200 °C]──► C₆H₅-CH₂-CH₃ (ethylbenzene)\n\n"
"Net result: Introduction of an ethyl group onto benzene ring WITHOUT carbocation rearrangement.", s))
story.append(Spacer(1, 8))
# ── COMPARISON TABLE ──────────────────────────────────────────────────────
story += section_header("5. Wolff-Kishner vs. Clemmensen Reduction", s)
story.append(Paragraph(
"Both reactions accomplish the same overall transformation (C=O → CH₂) but under "
"opposite pH conditions. The choice depends entirely on the <b>acid/base sensitivity</b> "
"of the substrate.", s["body"]))
story.append(Spacer(1, 6))
def cp(text):
return Paragraph(text, ParagraphStyle("cmp", fontSize=8.5, fontName="Helvetica",
textColor=BLACK, leading=13))
def cpb(text):
return Paragraph(text, ParagraphStyle("cmpb", fontSize=8.5, fontName="Helvetica-Bold",
textColor=DARK_BLUE, leading=13))
comp_rows = [
[cpb("Reagents"), cp("NH₂NH₂, KOH, ethylene glycol"), cp("Zn(Hg) amalgam, conc. HCl")],
[cpb("Conditions"), cp("Strongly BASIC, ~200 °C"), cp("Strongly ACIDIC, reflux")],
[cpb("Mechanism"), cp("Via hydrazone anion; carbanion intermediate"), cp("Via organozinc intermediate (radical/ionic)")],
[cpb("Substrate\nPreference"), cp("Acid-sensitive compounds\n(acetals, some esters)"), cp("Base-sensitive compounds\n(esters, lactones)")],
[cpb("Solvent"), cp("Ethylene glycol (high bp)"), cp("Aqueous HCl")],
[cpb("Byproduct"), cp("N₂ gas + H₂O"), cp("ZnCl₂ + H₂O")],
[cpb("Tolerates"), cp("Acid-labile groups"), cp("Base-labile groups")],
[cpb("Does NOT\nTolerate"), cp("Esters, acid-sensitive groups"), cp("Acid-sensitive groups, enolizable positions")],
[cpb("Named after"), cp("N. Kishner (1911), L. Wolff (1912)"), cp("E. Clemmensen (1913)")],
]
comp_headers = [
Paragraph("<b>Feature</b>", ParagraphStyle("th", fontSize=9, fontName="Helvetica-Bold", textColor=WHITE, leading=13)),
Paragraph("<b>Wolff-Kishner</b>", ParagraphStyle("th", fontSize=9, fontName="Helvetica-Bold", textColor=WHITE, leading=13)),
Paragraph("<b>Clemmensen</b>", ParagraphStyle("th", fontSize=9, fontName="Helvetica-Bold", textColor=WHITE, leading=13)),
]
comp_data = [comp_headers] + comp_rows
comp_t = Table(comp_data, colWidths=[3.5*cm, 8*cm, 8*cm],
style=TableStyle([
("BACKGROUND", (0,0), (-1,0), DARK_BLUE),
("BACKGROUND", (0,1), (0,-1), LIGHT_BLUE),
("FONTNAME", (0,1), (0,-1), "Helvetica-Bold"),
("ROWBACKGROUNDS",(1,1), (-1,-1), [WHITE, LIGHT_GREY]),
("GRID", (0,0), (-1,-1), 0.4, MID_GREY),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 8),
("VALIGN", (0,0), (-1,-1), "TOP"),
("FONTSIZE", (0,1), (-1,-1), 8.5),
]))
story.append(comp_t)
story.append(Spacer(1, 4))
story.append(info_box(
"<b>Decision Rule:</b> If the molecule contains <b>acid-labile</b> groups (e.g., acetals, "
"glycosides, certain esters) → use <b>Wolff-Kishner</b> (basic conditions). "
"If the molecule contains <b>base-labile</b> groups (e.g., esters, sensitive lactones) → "
"use <b>Clemmensen</b> (acidic conditions).", s))
story.append(Spacer(1, 8))
# ── LIMITATIONS ───────────────────────────────────────────────────────────
story += section_header("6. Limitations", s)
lims = [
("High Temperature Required (~180–200 °C)",
"The reaction cannot be used for thermally labile substrates. Even with the Huang Minlon "
"modification the temperature remains near 200 °C."),
("Strongly Basic Conditions",
"Incompatible with base-sensitive functional groups: esters undergo saponification, "
"certain lactones open, and epimerization can occur at base-sensitive stereocentres."),
("Double-Bond Migration",
"With α,β-unsaturated carbonyl compounds, the expected carbonyl reduction may be "
"accompanied by (or replaced by) migration of the double bond, giving undesired products."),
("Slow with Hindered Ketones",
"Sterically hindered ketones (e.g., tertiary adjacent groups) react slowly and may give "
"incomplete conversion even with the Huang Minlon modification."),
("Limited Functional Group Tolerance",
"The combination of high temperature and strong base limits the range of functional groups "
"that can coexist in the substrate: no sensitive aromatic heterocycles, no easily reducible "
"nitro groups, caution with halogens near the carbonyl."),
("N₂ Evolution Hazard at Scale",
"Large-scale reactions must account for safe venting of N₂ gas. Industrial scale-up "
"requires specific engineering controls."),
]
for i, (lim_title, lim_body) in enumerate(lims):
bg = LIGHT_RED if i % 2 == 0 else colors.HexColor("#FFF3E0")
lim_t = Table([
[Paragraph(f"<b>⚠ {lim_title}</b>",
ParagraphStyle("limtitle", fontSize=9, fontName="Helvetica-Bold",
textColor=RED_DARK)),
Paragraph(lim_body, s["body"])],
], colWidths=[5.5*cm, W - 5.5*cm],
style=TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("GRID", (0,0), (-1,-1), 0.4, MID_GREY),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 8),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(lim_t)
story.append(Spacer(1, 3))
story.append(Spacer(1, 8))
# ── KEY REFERENCES ────────────────────────────────────────────────────────
story += section_header("7. Key Literature References", s)
refs = [
("Wolff, L. (1912)", "Methode zum Ersatz des Sauerstoffatoms der Ketone und Aldehyde durch Wasserstoff. "
"Liebigs Ann. Chem., 394(1), 86. DOI: 10.1002/jlac.19123940107 — Original paper."),
("Kishner, N. (1911)", "J. Russ. Phys. Chem. Soc., 43, 582 — Independent discovery of the reaction."),
("Szmant, H.H. & Harmuth, C.H. (1964)", "The Wolff-Kishner Reaction of Hydrazones. "
"J. Am. Chem. Soc., 86(14), 2909. DOI: 10.1021/ja01068a028 — Definitive mechanistic study "
"(Hammett analysis; confirmed RDS and rate law)."),
("Huang Minlon (1946)", "A Simple Modification of the Wolff-Kishner Reduction. "
"J. Am. Chem. Soc., 68(12), 2487 — One-pot modification with distillation step."),
("Huang Minlon (1949)", "Reduction of Steroid Ketones and other Carbonyl Compounds by Modified "
"Wolff-Kishner Method. J. Am. Chem. Soc., 71(10), 3301 — Application to steroids."),
("Caglioti, L. (1972)", "Reduction of Ketones by Use of the Tosylhydrazone Derivatives: "
"Androstan-17β-ol. Org. Synth., 52, 122. DOI: 10.15227/orgsyn.052.0122"),
("Bamford & Stevens (1952)", "A New Method for Dehydrating Aldehydes and Ketones. "
"J. Chem. Soc., 4735 — Tosylhydrazone → alkene variant."),
]
for ref_title, ref_body in refs:
story.append(Paragraph(
f"<b>{ref_title}:</b> {ref_body}", s["bullet"]))
story.append(Spacer(1, 8))
# ── SUMMARY BOX ───────────────────────────────────────────────────────────
story += section_header("8. Summary at a Glance", s)
summary_data = [
[Paragraph("<b>Aspect</b>", s["body"]),
Paragraph("<b>Details</b>", s["body"])],
["Overall Change", "C=O → CH₂ (deoxygenation)"],
["Stage 1 Product", "Hydrazone (R₁R₂C=N–NH₂)"],
["Stage 2 Key Step", "Deprotonation of hydrazone NH₂ (RDS)"],
["Driving Force", "Expulsion of N₂ (thermodynamically irreversible)"],
["Rate Law", "v = k [hydrazone][OH⁻] (first order in each)"],
["Best Modification", "Huang Minlon (one-pot, higher yields, shorter times)"],
["Best Application", "Friedel-Crafts acylation → WK reduction (rearrangement-free alkylation)"],
["Use Over Clemmensen", "When substrate has acid-sensitive groups"],
["Avoid When", "Base-sensitive groups present, or substrate thermally labile"],
]
sum_t = Table(summary_data, colWidths=[5.5*cm, W-5.5*cm],
style=TableStyle([
("BACKGROUND", (0,0), (-1,0), DARK_BLUE),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("BACKGROUND", (0,1), (0,-1), LIGHT_BLUE),
("FONTNAME", (0,1), (0,-1), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 9),
("ROWBACKGROUNDS",(1,1), (-1,-1), [WHITE, LIGHT_GREY]),
("GRID", (0,0), (-1,-1), 0.4, MID_GREY),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 8),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
story.append(sum_t)
story.append(Spacer(1, 12))
story.append(Paragraph(
"This document was compiled from primary literature sources including Wolff (1912), "
"Kishner (1911), Szmant & Harmuth (1964), and Huang Minlon (1946, 1949).",
ParagraphStyle("footer_note", fontSize=8, fontName="Helvetica-Oblique",
textColor=MID_GREY, alignment=TA_CENTER)))
doc.build(story, canvasmaker=NumberedCanvas)
print(f"PDF saved to: {OUTPUT_PATH}")
return OUTPUT_PATH
if __name__ == "__main__":
build()
cd /home/daytona/workspace/wolff-kishner-pdf && python generate_pdf.py 2>&1
ls -lh /home/daytona/workspace/wolff-kishner-pdf/Wolff_Kishner_Reduction.pdf
Wolff Kishner Reduction
PDF Document · PDF