Конечно, если вы хотите подойти к вашему вопросу очень точно и избегать переноса только между q1 и q2 (и, например, разрешать перенос между q2 и q2), то задача становится немного интереснее:
\catcode`\@=11
\addtoparstylehooks{\xdef\lastmarker{\m@rker}}
\m@kedigitsletters
\def\@qone{q1}
\m@kedigitsother
\sethook{before}{q2}{\ifx\lastmarker\@qone\relax\nobreak\fi}
Здесь мы захватываем маркер предыдущего абзаца в конце каждого абзаца, а перед q2 проверяем, был ли маркер последнего абзаца q1, и если да, вставляем nobreak. Обратите внимание, что для сравнения маркера с q1 мы сохраняем q1 как объект для сравнения, но 1 в q1 — это буква, а не цифра, поэтому нам нужно перекатегоризовать цифры как буквы во время этого def, а затем вернуть их обратно. sethook умен тем, что выполняет эту перекатегоризацию за нас, избавляя нас от необходимости делать это вручную.