Why do checkboxes look so wierd and inconsistent? How to make it look like in the symbols reference?

Hey. When rendering the symbols for checkboxes/ballots they look weird, and do not correspond to those in the reference. Is this a bug or how to best resolve?

= Typst \#sym

- Square: #sym.square
- Ballot: #sym.ballot
- Crossed: #sym.ballot.cross
- Heavy: #sym.ballot.heavy
- Ballot check: #sym.ballot.check

= Unicode:

- Empty: ☐
- Checked: ☑
- Crossed: ☒

According to the symbols reference i would expect them to look like:

This could be a font issue? It is behaving unexpectedly without setting the font.

The symbols depend on the font, so you have full control over the final outcome here, but only if we try carefully. I suggest first turning off font fallback then it will only use the current font, and not try to find the symbol in other fonts.

#set text(fallback: false, font: "Libertinus Serif")
= Typst \#sym

- Square: #sym.square
- Ballot: #sym.ballot
- Crossed: #sym.ballot.cross
- Heavy: #sym.ballot.heavy
- Ballot check: #sym.ballot.check

= Unicode:

- Empty: ☐
- Checked: ☑
- Crossed: ☒

So now we have a new starting point for the question - it’s plain that the default font doesn’t give us any of these symbols, except the first one! Configure a font (or multiple fonts) that has symbols that look nice to you, and then it should be consistent.

I don’t think it’s a bug - symbol appearance always depends on the font used.

I’m an expert on Unicode Emoji, I know every hex codepoint.


If you like the style of Typst symbol doc, set the font Symbola.

#set text(font:"Symbola", fallback:false)
#set text(font: ("Noto Sans Symbol", "Noto Sans Symbol2"))