在环境中使用 \restoregeometry,下一页超出页面底部

在环境中使用 \restoregeometry,下一页超出页面底部

问题如下。

memoir文档中,我定义了页面几何形状:

\usepackage{geometry}
\geometry{
paperwidth=5.25in,
paperheight=8in,
textwidth=95mm,
textheight=150mm,
outer=17mm
}
\setlength{\stockwidth}{5.25in}
\setlength{\stockheight}{8in}
\addtolength{\headheight}{5pt}

然后我定义了一个环境,将一段文字放在页面的正中央:

\newenvironment{quotepage}[1]%
{\newpage\newgeometry{margin=0pt}%
\thispagestyle{empty}%
\bgroup\centering%
\noindent\par\mbox{}\vspace*{-\baselineskip}\vfill%
\begin{minipage}{#1}%
\setlength{\parskip}{0.6\baselineskip}%
\setlength{\parindent}{0pt}%
}{\end{minipage}%
\vfill\egroup%
\restoregeometry}

使用此环境时,

\begin{quotepage}{0.7\linewidth}
\itshape
What is the Noble Truth of Suffering? ...

Saṃyutta Nikāya 56.11, Dhammacakkappavattana Sutta
\end{quotepage}

下一页(调用后一页\restoregeometry)将以良好的页眉和文本宽度开始,但页面内容在页面底部超出页面范围。 之后的页面具有良好的页眉、页脚、文本宽度、高度等。

文字超出页面范围

但是,如果我不使用环境,就不会发生这种情况。如果我只是复制粘贴环境应该插入的代码,那么之后的页面\restoregeometry就很好,其余的也很好。

非常令人困惑。我定义环境的方式出了问题,但我搞不清楚。有人能看出问题所在吗?

答案1

您使用的组太多,无法正确恢复几何形状,因为\restoregeometry当 LaTeX 仍在处理形成组的环境时发出了该命令:

\newenvironment{quotepage}[1]
  {\newpage
   \newgeometry{margin=0pt}
   \thispagestyle{empty}
   \centering
   \vspace*{\fill}\vspace{-\baselineskip}
   \begin{minipage}{#1}
   \setlength{\parskip}{0.6\baselineskip}
   \setlength{\parindent}{0pt}
  }
  {\end{minipage}
   \vfill
   \clearpage
   \aftergroup\restoregeometry
  }

您可能想要查看其他解决方案,例如 TikZ 提供了将节点置于物理页面中心的功能。

\usepackage{tikz}
\newsavebox{\quotepagebox}
\newenvironment{quotepage}[1]
  {\begin{lrbox}{\quotepagebox}\begin{minipage}{#1}
   \setlength{\parskip}{0.6\baselineskip}
   \setlength{\parindent}{0pt}}
  {\end{minipage}\end{lrbox}%
   \clearpage\thispagestyle{empty}
   \begin{tikzpicture}[remember picture,overlay]  
   \node at (current page.center) {\usebox{\quotepagebox}};
   \end{tikzpicture}
   \clearpage}

答案2

如上所述egreg\restoregeometry必须在环境之外执行。

您可以使用包\AfterEndEnvironment中的 -hooketoolbox来实现这一点。

来自etoolbox文档:

\AfterEndEnvironment{environment}{code}

在保存环境的组关闭之后,将任意内容附加code到在命令的很晚的时间点执行的钩子上。\end

梅威瑟:

\documentclass[a6paper,landscape]{article}
\usepackage{etoolbox}
\usepackage[showframe]{geometry}
\usepackage{lipsum}

\newenvironment{myenv}{Hello!}{Bye!}
\BeforeBeginEnvironment{myenv}{\newgeometry{left=5mm,right=5mm,top=5mm,bottom=5mm}}
\AfterEndEnvironment{myenv}{\restoregeometry}

\begin{document}
\lipsum[1]
\begin{myenv}
Test
\end{myenv}
\lipsum[2-3]
\end{document}

输出:

双视图中的 MWE 输出。尽管第 2 页具有新几何图形,但第 3 页上的文本不会超出页面底部。

相关内容