I used to typeset verse with memoir package using some heavy \vspace trickery. The verse environment was too hard to control in terms of vertical space due to the immense amount of obscure glue. For instance, whenever I inserted a centered line (header, remark etc.) within a verse, the spacing was almost uncontrollable. The whole document started with \begin{verse}, contained verse with headers and ended with \end{verse}
To avoid hundreds of manual environment invocations, a prior answer was implemented in order to provide an environment detector (\Bverse to begin verse if not inside one already, \Everse to end one). I defined \ACT, \SCENE, \descr and \hero commands so as to check whether we are inside a verse environment, end if yes, typeset the ornate header and then resume the verse environment. However, the provided example fails to terminate the environments and goes on nesting them.
! LaTeX Error: Too deeply nested.
l.61 \herov{Альцест}
- Why are my environments being nested?
- Isn’t there a better solution to break a long verse with interwoven headers?
Please excuse the redundant working example, I did my best to minimize it in order to obtain the “too deeply nested” error. My example:
\documentclass{memoir}
\usepackage[utf8]{inputenc}
\usepackage[T2A]{fontenc}
\usepackage[russian]{babel}
\usepackage{soulutf8}
\sodef\sohe{}{.19em}{.6em plus.05em}{.5em plus.05em minus.05em}
\newcommand{\hero}[1]{\sohe{#1}}
\makeatletter
\newcommand{\Bverse}{%
\ifx\@currenvir\@verse
\else
\begin{verse}
\fi}
\newcommand\@verse{verse}
\newcommand{\Everse}{%
\ifx\@currenvir\@verse
\end{verse}
\else
\fi}
\makeatother
\newenvironment{center*}{\setlength\topsep{0pt}\setlength\parskip{0pt}\begin{center}}{\end{center}}
\newcommand{\SCENE}[1]{\Everse %
\begin{center*}\textsc{ #1}\end{center*}%
\Bverse %
}
\newcommand{\ACT}[1]{\Everse %
\newpage\begin{center*}\textsc{\textbf{\large #1}}\end{center*}%
\Bverse %
}
\newcommand{\descr}[1]{%
\Everse %
\begin{center*}\small #1\end{center*} %
\Bverse %
}
\newcommand{\herov}[1]{\Everse%
\begin{center*} \hero{#1} \end{center*}%
\Bverse%
}
\begin{document}
\begin{verse}
\ACT{Действие первое}
\SCENE{Явление первое}
\descr{\hero{Альцест} и \hero{Филинт}.}
\herov{Альцест}
Как шутки эти здесь некстати "--- просто срам!
\herov{Филинт}
Ну, шутки в сторону. Чего же нужно вам?
\herov{Альцест}
Чтоб люди искренни всегда и честны были \\
И только правду бы, от сердца, говорили.
\herov{Филинт}
Когда мы чьим-нибудь приветом польщены, \\
Платить мы тою же монетою должны: \\
Приветом за привет, услугой за услугу, \\
За клятву "--- клятвою, как преданному другу.
\end{verse}
\end{document}
UPDATE: Please see the picture of the version I had had before “optimizing” the code.

\Bverseand\Everseto do nothing and\newenvironment{center*}{\par\centering}{\par}, I get the document compiled. – egreg Feb 19 '14 at 09:47verseenvironment, but what I want is to begin averseenvironment and terminate it with custom designed centered lines, and start a newverseafterwards, since it is very hard to fine-tune penalties, glue and breaking rules between those different types of centered announcements insideverseenvironment. – Andreï V. Kostyrka Feb 19 '14 at 10:16