  In order to work with mathematical content in computer systems, it is
necessary to represent it in formal languages. Ideally, these are supported by
tools that verify the correctness of the content, allow computing with it, and
produce human-readable documents. These goals are challenging to combine and
state-of-the-art tools typically have to make difficult compromises.
  In this paper we discuss languages that have been created for this purpose,
including logical languages of proof assistants and other formal systems,
semi-formal languages, intermediate languages for exchanging mathematical
knowledge, and language frameworks that allow building customized languages.
  We evaluate their advantages based on our experience in designing and
applying languages and tools for formalizing mathematics. We reach the
conclusion that no existing language is truly good enough yet and derive ideas
for possible future improvements.
