![在环境中使用 \restoregeometry,下一页超出页面底部](https://linux22.com/image/244500/%E5%9C%A8%E7%8E%AF%E5%A2%83%E4%B8%AD%E4%BD%BF%E7%94%A8%20%5Crestoregeometry%EF%BC%8C%E4%B8%8B%E4%B8%80%E9%A1%B5%E8%B6%85%E5%87%BA%E9%A1%B5%E9%9D%A2%E5%BA%95%E9%83%A8.png)
问题如下。
在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}
输出: