Glifos são as figuras dos caracteres. Na falta de um glifo, o software usado para exibir o texto mostra um caractere alternativo, geralmente um retângulo branco apelidado de "tofu".
As fontes padrão do asciidoctor-pdf não têm os glifos de
todos os caracteres que usei no Python Fluente Segunda Edição.
Por isso inicialmente o PDF exibia dúzias de tofu.
O PDF é o miolo do livro que vai para gráfica.
Tem tudo menos as capas.
O problema não acontece nos navegadores exibindo o livro em HTML: https://pythonfluente.com.
Para diagnosticar o problema, escrevi list_symbols.py que lê
stdin ou arquivos de uma lista de argumentos na linha de comando,
e gera no stdout um arquivo .adoc com cada um dos caracteres
não-ASCII que aparecem nos arquivos de entrada, bem como sua contagem.
O ideal seria configurar o asciidoctor-pdf para usar o conceito
de fallback font: uma ou mais fonte alternativas onde encontrar
os glifos faltando.
Em tese, todos os glifos necessários existem na
coleção de fontes Noto.
Mas a fonte Noto distribuída com o asciidoctor-pdf não tem todos os glifos,
e minhas tentativas de usar fallback fracassaram.
Eu poderia editar a fonte Noto que vem com o asciidoctor-pdf para
incluir algumas dúzias de glifos necessários para o Python Fluente,
mas a documentação do Asciidoctor alerta que há vários truques necessários
para que uma fonte moderna como a Noto funcionem com a biblioteca
prawn em Ruby, usada pelo asciidoctor-pdf, que depende de informações
consideradas obsoletas, que as fontes modernas não têm.
Como não sou especialista em fontes, esse plano ficou inviável.
Descobri que a maioria dos tofus estão no capítulo 4 cujo tema é Unicode. Alguns símbolos de operações de conjunto aparecem no capítulo 3, sobre dicts e sets.
Com o prazo acabando, removi os caracteres que apareciam como tofu no capítulo 2, e coloquei notas explicando o problema no capítulo 4.