Bien sûr, si vous voulez poser votre question très précisément et éviter uniquement la coupure entre q1 et q2 (et dire par exemple qu'une coupure est autorisée entre q2 et q2), alors le problème devient un peu plus intéressant :
\catcode`\@=11
\addtoparstylehooks{\xdef\lastmarker{\m@rker}}
\m@kedigitsletters
\def\@qone{q1}
\m@kedigitsother
\sethook{before}{q2}{\ifx\lastmarker\@qone\relax\nobreak\fi}
Ici, nous récupérons le marqueur du paragraphe précédent à la fin de chaque paragraphe, puis avant un q2, nous testons si le marqueur du dernier paragraphe était un q1 et, si c'est le cas, nous insérons le nobreak. Remarquez que pour comparer le marqueur avec q1, nous stockons q1 comme quelque chose à comparer, mais le 1 dans q1 est une lettre et non un chiffre, donc nous devons recategoriser les chiffres comme des lettres pendant que nous faisons cette définition, puis les remettre en place. sethook est malin en ce sens qu'il effectue la recategorisation pour nous sans avoir à faire ce genre de chose.