我想定义一个环境,插入一个与序言中定义的边距不同的页面。
我尝试使用以下 LaTeX 代码。
\documentclass[a4paper,10pt]{article}
\usepackage[left=5.2cm,top=2cm,right=1.5cm,bottom=2cm,nohead,nofoot]{geometry}
\usepackage{blindtext}
\newenvironment{myenv}{
\newgeometry{left=1.5cm,top=20cm,right=1.5cm,bottom=2cm,nohead,nofoot}
\blindtext[2]
}{
\newpage
\restoregeometry
}
\begin{document}
\begin{myenv}
\end{myenv}
\blindtext[10]
\end{document}
不幸的是,第二页几行之后出现了意外的分页符。以下代码产生了所需的结果。
\documentclass[a4paper,10pt]{article}
\usepackage[left=5.2cm,top=2cm,right=1.5cm,bottom=2cm,nohead,nofoot]{geometry}
\usepackage{blindtext}
\newenvironment{myenv}{
\newgeometry{left=1.5cm,top=20cm,right=1.5cm,bottom=2cm,nohead,nofoot}
\blindtext[2]
}{
\newpage
}
\begin{document}
\begin{myenv}
\end{myenv}
\restoregeometry
\blindtext[10]
\end{document}
但是我不想\restoregeometry
每次使用时都手动输入myenv
。有人能解释一下上面两段代码的区别并提供解决方案吗?谢谢。
答案1
我不知道您要做什么,但是包\AfterEndEnvironment
中的命令etoolbox
可以帮助您。
它在环境结束后立即插入一些代码。
因此,在你的序言中添加
\usepackage{etoolbox}
\AfterEndEnvironment{myenv}{\restoregeometry}
应该可以让你实现你的愿望。
完成 MWE
\documentclass[a4paper,10pt]{article}
\usepackage[left=5.2cm,top=2cm,right=1.5cm,bottom=2cm,nohead,nofoot]{geometry}
\usepackage{blindtext}
\usepackage{etoolbox}
\AfterEndEnvironment{myenv}{\restoregeometry}
\newenvironment{myenv}{%
\newgeometry{left=1.5cm,top=20cm,right=1.5cm,bottom=2cm,nohead,nofoot}%
\blindtext[2]%
}{%
\newpage%
}
\begin{document}
\begin{myenv}
\end{myenv}
\blindtext[10]
\end{document}
回答您评论中的问题,我认为\restoregeometry
如果将其放在环境端则不起作用,因为后者形成了一个组。
实际上,如果你告诉 LaTeX\restoregeometry
在组完成命令后执行\aftergroup
,则你有一个不需要的解决方案\AfterEndEnvironment
:
\newenvironment{myenv}{%
\newgeometry{left=1.5cm,top=20cm,right=1.5cm,bottom=2cm,nohead,nofoot}%
\blindtext[2]%
}{%
\newpage\aftergroup\restoregeometry%
}