![检查环境以结束它](https://linux22.com/image/284677/%E6%A3%80%E6%9F%A5%E7%8E%AF%E5%A2%83%E4%BB%A5%E7%BB%93%E6%9D%9F%E5%AE%83.png)
我曾经使用memoir
一些\vspace
技巧用包排版诗句。由于大量模糊的粘连,诗句环境在垂直空间方面难以控制。例如,每当我在诗句中插入居中线(标题、注释等)时,间距几乎无法控制。整个文档以 开头\begin{verse}
,包含带有标题的诗句,并以\end{verse}
为了避免数百次手动环境调用,先前的答案是为了提供环境检测器而实现的(如果尚未进入环境则开始,如果已进入则结束)。我定义了、和\Bverse
命令,以便检查我们是否处于 verse 环境中,如果是则结束,排版华丽标题,然后恢复 verse 环境。但是,提供的示例无法终止环境并继续嵌套它们。verse
\Everse
\ACT
\SCENE
\descr
\hero
! LaTeX Error: Too deeply nested.
l.61 \herov{Альцест}
- 为什么我的环境是嵌套的?
- 有没有更好的解决方案来打破带有交织标题的长诗?
请原谅这个重复的工作示例,我尽力将其最小化,以获得“嵌套太深”的错误。我的例子:
\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}
更新:请查看我“优化”代码之前版本的图片。