The Gedcom standard handles simple citations quite well.
For published material, the source record contains fields for author, title, abbreviation and publication information. The source-citation allows any key-value pairs to be stored in the PAGE tag. This makes citations quite flexible.
For unpublished material, such as documents and artifacts, we can store a catalogue reference (call number) in a structure that points to a repository record. The repository is the physical location, such as an archive, where the source can be found.
Where it doesn’t work quite as well is for layered citations. There is a good article called Layered Citations Work Like Layered Clothing on the Evidence Explained website. I also found a video if anyone wants to look into this further. The same issue applies with applications such as Zotero.
In Gramps, we introduced an extra layer to handle large sources. This was a fixed two layer Citation-Source solution. It doesn’t help with three layer (or more) citations, and doesn’t provide a neat way of recording single layer citations.
A solution to this would be to allow multiple layers of sources. A citation would become a source layer. Each layer should be able to store key-value pairs to use in a formatted citation.
Such a solution would obviously need a different way of producing formatted citations. At the moment, we only use the Gedcom fields. Creating citation formatter plugins would seem like the way to go here. We could write a default formatter for Gedcom fields, another that uses templates, and perhaps another that generates Chicago Manual of Style compatible citations. I have already experimented with this and it works quite well.