edit - whoops, just realised I've assumed the 5e Roll20 sheet. The repeating section names will be wrong if you're using another sheet.
Nope, no Pro required! And you can even skip the whole Stylus/CSS thing with some (rather ugly) style injection:
&{noerror} &{template:default}{{name=Spellbook}}{{Cantrips=[@{selected|repeating_spell-cantrip_$0_spellname}](~selected|repeating_spell-cantrip_$0_spell" style="background:none;border:none;color:blue;display:none;display:inline@{selected|repeating_spell-cantrip_$0_spellname|max})
[@{selected|repeating_spell-cantrip_$1_spellname}](~selected|repeating_spell-cantrip_$1_spell" style="background:none;border:none;color:blue;display:none;display:inline@{selected|repeating_spell-cantrip_$1_spellname|max})
[@{selected|repeating_spell-cantrip_$2_spellname} ](~selected|repeating_spell-cantrip_$2_spell" style="background:none;border:none;color:blue;display:none;display:inline@{selected|repeating_spell-cantrip_$2_spellname|max})
[@{selected|repeating_spell-cantrip_$3_spellname}](~selected|repeating_spell-cantrip_$3_spell" style="background:none;border:none;color:blue;display:none;display:inline@{selected|repeating_spell-cantrip_$3_spellname|max})}} {{Level 1
@{selected|lvl1_slots_expended}/@{selected|lvl1_slots_total} Slots=[@{selected|repeating_spell-1_$0_spellname}](~selected|repeating_spell-1_$0_spell" style="background:none;border:none;color:blue;display:none;display:inline@{selected|repeating_spell-1_$0_spellname|max})
[@{selected|repeating_spell-1_$1_spellname}](~selected|repeating_spell-1_$1_spell" style="background:none;border:none;color:blue;display:none;display:inline@{selected|repeating_spell-1_$1_spellname|max})
[@{selected|repeating_spell-1_$2_spellname} ](~selected|repeating_spell-1_$2_spell" style="background:none;border:none;color:blue;display:none;display:inline@{selected|repeating_spell-1_$2_spellname|max})
[@{selected|repeating_spell-1_$3_spellname}](~selected|repeating_spell-1_$3_spell" style="background:none;border:none;color:blue;display:none;display:inline@{selected|repeating_spell-1_$3_spellname|max})}}{{Level 2
@{selected|lvl2_slots_expended}/@{selected|lvl2_slots_total} Slots=[@{selected|repeating_spell-2_$0_spellname}](~selected|repeating_spell-2_$0_spell" style="background:none;border:none;color:blue;display:none;display:inline@{selected|repeating_spell-2_$0_spellname|max})
[@{selected|repeating_spell-2_$1_spellname}](~selected|repeating_spell-2_$1_spell" style="background:none;border:none;color:blue;display:none;display:inline@{selected|repeating_spell-2_$1_spellname|max})
[@{selected|repeating_spell-2_$2_spellname} ](~selected|repeating_spell-2_$2_spell" style="background:none;border:none;color:blue;display:none;display:inline@{selected|repeating_spell-2_$2_spellname|max})
[@{selected|repeating_spell-2_$3_spellname}](~selected|repeating_spell-2_$3_spell" style="background:none;border:none;color:blue;display:none;display:inline@{selected|repeating_spell-2_$3_spellname|max})}}
Just an example with 4 spells per tier, you'd probably want to increase that. And you can pretty it up, and remove blank lines, using Stylus if you prefer. Also, you probably want to put a /w "@{selected|character_name}" at the start, or just hard code it with /w "playerName".
If it's for a player, I'd also do a Replace All and change selected to the character name, so you don't have the annoyance of the macro not working if your token isn't selected.
If you only want to display prepared spells, that definitely requires Stylus (so only works for the person running the Stylus changes).