Claro, se você quiser levar sua pergunta ao extremo e evitar apenas a quebra entre q1 e q2 (e, por exemplo, permitir uma quebra entre q2 e q2), o problema fica um pouco mais interessante:
\catcode`\@=11
\addtoparstylehooks{\xdef\lastmarker{\m@rker}}
\m@kedigitsletters
\def\@qone{q1}
\m@kedigitsother
\sethook{before}{q2}{\ifx\lastmarker\@qone\relax\nobreak\fi}
Aqui, obtemos o marcador do parágrafo anterior no final de cada parágrafo e, antes de um q2, testamos se o marcador do último parágrafo era um q1 e, se for, inserimos o nobreak. Observe que, para comparar o marcador com q1, armazenamos q1 como algo para comparação, mas o 1 em q1 é uma letra, não um dígito, então temos que recategorizar dígitos como letras enquanto fazemos esse def e depois colocá-los de volta. O sethook é esperto no sentido de fazer a recategorização por nós, sem termos que fazer esse tipo de coisa.