I implemented this myself for personal use. I don't know if it would be useful. I tested it by giving dogs the same raws and butchered them in fortress mode, but haven't tried it with a real sperm whale; It was for in case I randomly happen upon one in fort mode.
To the sperm whales I add a new organ and a load of materials. When you butcher one you get globs of spermaceti because the new organ is made of it.
[BODY:BASIC_2PARTBODY:BASIC_HEAD_NECK:SIDE_FLIPPERS:TAIL:2EYES:2LUNGS:HEART:GUTS:ORGANS:NECK:SPINE:BRAIN:SKULL:MOUTH:GENERIC_TEETH:RIBCAGE:SPERMACETI_ORGAN]
[BODY_DETAIL_PLAN:STANDARD_MATERIALS]
[REMOVE_MATERIAL:HAIR]
[BODY_DETAIL_PLAN:STANDARD_TISSUES]
[REMOVE_TISSUE:HAIR]
[USE_MATERIAL_TEMPLATE:RAW_SPERMACETI:CREATURE_EXTRACT_TEMPLATE]
[STATE_NAME_ADJ:ALL_SOLID:raw spermaceti]
[STATE_NAME_ADJ:LIQUID:raw spermaceti]
[STATE_NAME_ADJ:GAS:n/a]
[STATE_COLOR:ALL:BROWN]
[PREFIX:NONE]
[DISPLAY_COLOR:6:0:0]
[IGNITE_POINT:10338]
[MELTING_POINT:10078]
[BOILING_POINT:NONE]
[HEATDAM_POINT:10250]
[COLDDAM_POINT:9900]
[MAT_FIXED_TEMP:NONE]
[SOLID_DENSITY:900]
[LIQUID_DENSITY:800]
[MOLAR_MASS:NONE]
[IMPACT_STRAIN_AT_YIELD:50000]
[COMPRESSIVE_STRAIN_AT_YIELD:50000]
[TENSILE_STRAIN_AT_YIELD:50000]
[TORSION_FRACTURE:10000]
[TORSION_STRAIN_AT_YIELD:50000]
[SHEAR_YIELD:10000] no data
[SHEAR_FRACTURE:10000]
[SHEAR_STRAIN_AT_YIELD:50000]
[BENDING_STRAIN_AT_YIELD:50000]
[MAX_EDGE:0]
[DO_NOT_CLEAN_GLOB]
[REACTION_CLASS:RAW_SPERMACETI]
[MATERIAL_REACTION_PRODUCT:RENDER_MAT:LOCAL_CREATURE_MAT:PURE_SPERMACETI]
[IMPLIES_ANIMAL_KILL]
[ROTS]
[GENERATES_MIASMA]
[BUTCHER_SPECIAL:GLOB:NONE]
[MATERIAL_VALUE:2]
[USE_MATERIAL_TEMPLATE:PURE_SPERMACETI:CREATURE_EXTRACT_TEMPLATE]
[STATE_NAME_ADJ:ALL_SOLID:pure spermaceti]
[STATE_NAME_ADJ:LIQUID:pure spermaceti]
[STATE_NAME_ADJ:GAS:boiling pure spermaceti]
[STATE_COLOR:ALL:WHITE]
[PREFIX:NONE]
[DISPLAY_COLOR:7:1:0]
[IGNITE_POINT:10338]
[MELTING_POINT:10078]
[BOILING_POINT:NONE]
[HEATDAM_POINT:10250]
[COLDDAM_POINT:9900]
[MAT_FIXED_TEMP:NONE]
[SOLID_DENSITY:900]
[LIQUID_DENSITY:800]
[MOLAR_MASS:NONE]
[IMPACT_STRAIN_AT_YIELD:50000]
[COMPRESSIVE_STRAIN_AT_YIELD:50000]
[TENSILE_STRAIN_AT_YIELD:50000]
[TORSION_FRACTURE:10000]
[TORSION_STRAIN_AT_YIELD:50000]
[SHEAR_YIELD:10000] no data
[SHEAR_FRACTURE:10000]
[SHEAR_STRAIN_AT_YIELD:50000]
[BENDING_STRAIN_AT_YIELD:50000]
[MAX_EDGE:0]
[DO_NOT_CLEAN_GLOB]
[REACTION_CLASS:PURE_SPERMACETI]
[MATERIAL_REACTION_PRODUCT:SPERM_OIL:LOCAL_CREATURE_MAT:SPERM_OIL]
[MATERIAL_REACTION_PRODUCT:SPERMACETI_WAX:LOCAL_CREATURE_MAT:SPERMACETI_WAX]
[IMPLIES_ANIMAL_KILL]
[ROTS]
[MATERIAL_VALUE:2]
[USE_MATERIAL_TEMPLATE:SPERMACETI_WAX:WAX_TEMPLATE]
[STATE_NAME_ADJ:ALL_SOLID:spermaceti wax]
[STATE_NAME_ADJ:LIQUID:melted spermaceti wax]
[STATE_NAME_ADJ:GAS:n/a]
[STATE_COLOR:ALL:WHITE]
[PREFIX:NONE]
[IMPLIES_ANIMAL_KILL]
[MATERIAL_VALUE:2]
[USE_MATERIAL_TEMPLATE:SPERM_OIL:CREATURE_EXTRACT_TEMPLATE]
[STATE_NAME_ADJ:ALL_SOLID:frozen sperm oil]
[STATE_NAME_ADJ:LIQUID:sperm oil]
[STATE_NAME_ADJ:GAS:boiling sperm oil]
[STATE_COLOR:ALL:WHITE]
[PREFIX:NONE]
[IMPLIES_ANIMAL_KILL]
[MATERIAL_REACTION_PRODUCT:SOAP_MAT:LOCAL_CREATURE_MAT:SOAP]
[MATERIAL_VALUE:2]
[SELECT_MATERIAL:SOAP]
[PREFIX:NONE]
[STATE_COLOR:ALL_SOLID:CREAM]
[STATE_NAME:ALL_SOLID:sperm oil soap]
[STATE_ADJ:ALL_SOLID:sperm oil soap]
[STATE_COLOR:LIQUID:CREAM]
[STATE_NAME:LIQUID:melted sperm oil soap]
[STATE_ADJ:LIQUID:melted sperm oil soap]
[STATE_COLOR:GAS:CREAM]
[STATE_NAME:GAS:n/a]
[STATE_ADJ:GAS:n/a]
[MATERIAL_VALUE:2]
[TISSUE:SPERMACETI]
[TISSUE_NAME:spermaceti:NP]
[TISSUE_MATERIAL:LOCAL_CREATURE_MAT:RAW_SPERMACETI]
[RELATIVE_THICKNESS:1]
[CONNECTS]
[TISSUE_SHAPE:LAYER]
[TISSUE_LAYER:BY_CATEGORY:SPERMACETI_ORGAN:SPERMACETI]
[BODY_DETAIL_PLAN:VERTEBRATE_TISSUE_LAYERS:SKIN:FAT:MUSCLE:BONE:CARTILAGE]
The organ:
[BODY:SPERMACETI_ORGAN]
[BP:SPERMACETI_ORGAN:spermaceti organ:STP][CONTYPE:HEAD][INTERNAL][SMALL][CATEGORY:SPERMACETI_ORGAN]
[DEFAULT_RELSIZE:200]
Then the reactions for boiling it to purify and pressing into oil and wax:
[REACTION:BOIL_SPERMACETI]
[NAME:boil spermaceti]
[BUILDING:KITCHEN:CUSTOM_B]
[REAGENT:A:1:GLOB:NONE:NONE:NONE][REACTION_CLASS:RAW_SPERMACETI][UNROTTEN]
[HAS_MATERIAL_REACTION_PRODUCT:RENDER_MAT]
[PRODUCT:100:1:GLOB:NONE:GET_MATERIAL_FROM_REAGENT:A:RENDER_MAT]
[SKILL:COOK]
[AUTOMATIC]
[REACTION:PRESS_SPERMACETI]
[NAME:press oil and wax from pure spermaceti]
[BUILDING:SCREW_PRESS:CUSTOM_S]
[REAGENT:pure spermaceti:1:GLOB:NONE:NONE:NONE][REACTION_CLASS:PURE_SPERMACETI][UNROTTEN]
[HAS_MATERIAL_REACTION_PRODUCT:SPERM_OIL]
[REAGENT:liquid container:1:TOOL:NONE:NONE:NONE]
[EMPTY]
[DOES_NOT_ABSORB]
[PRESERVE_REAGENT]
[HAS_TOOL_USE:LIQUID_CONTAINER]
[DOES_NOT_DETERMINE_PRODUCT_AMOUNT]
[PRODUCT:100:1:LIQUID_MISC:NONE:GET_MATERIAL_FROM_REAGENT:pure spermaceti:SPERM_OIL][PRODUCT_TO_CONTAINER:liquid container]
[PRODUCT:100:1:GLOB:NONE:GET_MATERIAL_FROM_REAGENT:pure spermaceti:SPERMACETI_WAX][PRODUCT_PRESSED]
[SKILL:PRESSING]
The wax and oil can be used for crafts and soap respectively (like bees wax and plant oil).
spermaceti wax food > fat
raw spermaceti food > extract (animal)
pure spermaceti food > extract (animal)
sperm oil food > extract (animal)
Tried to mirror the similar default material stockpiles.
bee wax food > fat
bee honey food > extract (animal)
rock nut oil food > extract (plant)
One thing that needs looking at is values; I mean to make it so the products of spermaceti are more valuable than the default oil/wax.
Another thing is that the LIQUID_MISC_CREATURE token on the raw and pure spermaceti materials cause them to be listed by their liquid name in the stockpile menu, yet this token is needed to get the items stockpiled sensibly. To get around this I just gave them the same liquid and solid names. It does mean if it melts it won't be called molten, but I see no other way.