我正在尝试构建一个环境,如果环境中出现分页符,则会自动在页面末尾打印一些附加文本,而当没有分页符时则不会打印这些文本。例如:
\begin{special_env}{Please also check following page}
A lot of text goes here...
And even more text goes here...
\end{special_env}
应在环境中正常打印文本,但每当出现分页符时都应在页面底部添加“请同时检查下一页”。
我知道 longtable 之类的东西可以做到这一点,但我的文本并不是真正的表格,而且我的 TeX 技能也不够高,无法弄清楚它们是如何做到的。我见过在可选分页符处添加自定义文本,它几乎满足了我的需求,只是它要求我已经知道分页符的大致位置。我也见过在可选分页符处添加自定义文本,这似乎又过于关注表格(除非我误解了)。
我的问题是,我该如何编写代码以便它能自动找出分页符的最终位置并在需要的位置插入文本?
虽然我作为 LaTeX 用户有一些经验,并且偶尔尝试编写一些稍微高级一些的脚本,但我的知识确实相当有限,所以请耐心等待我尝试消化您的答案。
[编辑]
谢谢你们的帮助。我尝试了所提出的不同变体,但还没有完全实现我需要的功能。虽然很接近,但还没有完全实现。让我更详细地介绍一下我想要实现的功能。我正在扩展一个定义问题环境的类,用于编写试卷。当问题继续出现在新页面上时,我们需要在该页面上添加“问题 X 继续出现在下一页”。该类目前使用一种有趣的方法来确定是否在问题之后分页。
那么,文档基本上由\maketitle
一系列question
环境组成,这些环境之间通常没有其他文本。
目前,我的代码看起来有点像这样:
\documentclass{article}
\usepackage{lipsum}
\makeatletter
\newif\ifinenv
\inenvfalse
\newcommand \@@footer{\ifinenv {QUESTION \thequestion\ CONTINUES ON NEXT PAGE} \fi}
\def \ps@exam{%
\let \@mkboth \@gobbletwo%
\def \@oddhead{}%
\def \@oddfoot{\@@footer}%
\def \@evenhead{}%
\def \@evenfoot{\@@footer}%
}
\pagestyle{exam}
\newcommand \testpagebreak[1]{%
\vfil%
\penalty #1%
\vfilneg%
}
\newcounter{question}
\newenvironment{question}{%
\refstepcounter{question}%
\inenvtrue
\begin{list}{}{}%
\item[\bf \thequestion.]%
}{%
\end{list}%
\testpagebreak{-350}%
}
\begin{document}
\begin{question}
\lipsum[1-7]
\end{question}
\begin{question}
\lipsum[8-13]
\end{question}
\begin{question}
Just a single line
And another
\end{question}
\end{document}
这种方法效果很好,但问题的开头被推到新页面的开头时除外。在这种情况下,PTO 文本将打印在页面上前问题开始了,例如:
Text of Question 1
Question 2 continues on the next page
----page break----
Text of Question 2
显然,问题在于,在 TeX 决定打开新页面之前,问题 2 的环境的启动仍然需要处理。如果我\testpagebreak
用硬件替换代码\newpage
或完全省略它,一切都会好起来。有没有办法摆弄这个代码让它工作\testpagebreak
(或其变体)?
[/编辑]
[编辑2]
我根据@Werner的想法做了一些实验。我的代码可以在以下网址找到:粘贴箱。请注意,第二个问题有两个替代版本的内容,一个短版,一个长版。使用短版(这样问题 2 实际上不会跨越多页)一切正常。使用长版(这样问题 2 确实跨越多页)时,“问题 2 继续”文本已显示在问题 1 的最后一页;这太早了一页。
由此,我推断标签机制工作正常。但是,页脚中的代码并不总是能正确地识别出问题是否真的从当前正在发送的页面上开始。我不知道如何解决这个问题,但也许有人可以给我指明一个有用的方向?
[/编辑2]
提前谢谢了,
斯特芬
答案1
那么下面这个想法怎么样?
它与您的(或可能是班级作者的)有很大不同,但可能更强大,因为它使用\label
-\ref
系统来确定问题中间是否发生了分页符:
\documentclass{article}
\usepackage[paper=a5paper,margin=1in]{geometry}% Just for this example
\usepackage{multido}% Just for this example
\usepackage[nopar]{lipsum}% Just for this example
\usepackage{refcount}
\usepackage{fancyhdr}
\newcounter{question}
\newenvironment{question}{%
\begin{list}{}{}%
\refstepcounter{question}%
\item[\bfseries\thequestion.]%
\leavevmode% Start paragraph
\label{question-start-\thequestion}%
}{%
\label{question-end-\thequestion}%
\end{list}
}
\pagestyle{fancy}
\fancyhf{}% Clear header/footer
\fancyfoot[L]{% Left footer
\ifnum\getpagerefnumber{question-start-\thequestion}<\getpagerefnumber{question-end-\thequestion}
Question~\thequestion{} continues on the next page%
\fi}
\fancyfoot[R]{See next page}% Right footer
\renewcommand{\headrulewidth}{0pt}% Remove header rule
\AtEndDocument{\fancyfoot[R]{}}% Remove right footer at end of document
\sloppypar% Just for this example
\begin{document}
\multido{\i=1+1}{50}{%
\begin{question}
\lipsum[\i]
\end{question}
\bigskip
}
\end{document}
在每个\item
内设置question
一个,然后在 的末尾设置另一个。检查开始处的页码是否不同于(小于)结束页码。据此,页脚设置适当的子句。\label
\label
question
答案2
我原本的想法是在环境开始时更改页脚,并在结束时将其恢复,但是如果环境结束时 TeX 存储的材料最终将包含分页符(最有可能的是如果环境结束时靠近页面顶部),则此方法会失败。
我认为正确的做法是在页脚本身中放置一个开关,以检测页面构建时环境是否处于活动状态。我使用了fancyhdr 包因为它使更改页脚变得非常容易,但这并不是绝对必要的。同样,我使用了几何包调整页面尺寸并将环境末尾从一个地方移动到另一个地方,但这只是为了测试目的。最后,请注意,不需要\inenvfalse
在环境末尾执行,因为\inenvtrue
是本地的,全局设置在 时恢复
\end{myenv}
。
\documentclass{article}
\usepackage[width=16cm,height=20cm]{geometry}
\usepackage{lipsum} % For dummy text
\usepackage{fancyhdr}
\pagestyle{fancy}
\newif\ifinenv
\inenvfalse
\newcommand\myrfoot{\ifinenv PTO \else Hello! \fi}
\rfoot\myrfoot
\newenvironment{myenv}
{\section*{Environment start!}\inenvtrue}
{\par\medskip\noindent\centering\rule{0.75\textwidth}{2pt}\par\bigskip}
\begin{document}
\lipsum[1-8]
\begin{myenv}
\lipsum[9-16]
\end{myenv}
\lipsum[17-24]
\end{document}