检查环境以结束它

检查环境以结束它

我曾经使用memoir一些\vspace技巧用包排版诗句。由于大量模糊的粘连,诗句环境在垂直空间方面难以控制。例如,每当我在诗句中插入居中线(标题、注释等)时,间距几乎无法控制。整个文档以 开头\begin{verse},包含带有标题的诗句,并以\end{verse}

为了避免数百次手动环境调用,先前的答案是为了提供环境检测器而实现的(如果尚未进入环境则开始,如果已进入则结束)。我定义了、和\Bverse命令,以便检查我们是否处于 verse 环境中,如果是则结束,排版华丽标题,然后恢复 verse 环境。但是,提供的示例无法终止环境并继续嵌套它们。verse\Everse\ACT\SCENE\descr\hero

! LaTeX Error: Too deeply nested.
l.61 \herov{Альцест}
  1. 为什么我的环境是嵌套的?
  2. 有没有更好的解决方案来打破带有交织标题的长诗?

请原谅这个重复的工作示例,我尽力将其最小化,以获得“嵌套太深”的错误。我的例子:

\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}

更新:请查看我“优化”代码之前版本的图片。 诗句排版,中间带有自定义标题

相关内容