Even then having both `heading_cell` and `title` doesn't make sense to me. Instead of using `copy` you could try

    def heading_cell(source):
        return {"cell_type": "heading","level": 3,"metadata": {},"source": [source]}
        
    ...
    
    title = heading_cell(cell['title'])