我正在尝试定义一个环境,它可以自动检测其中的材料何时移动到新页面,在新页面的顶部重新打印其中一个参数,并因此更改其关闭方式。到目前为止,这就是我想出的:
\newif\ifnewpage\newpagefalse
\newenvironment{sungpsalm}[2]%
{\def\antiphon{#1}\gdef\tone{#2}\antiphon\par\tone\par\AtBeginPage{%
\setlength{\unitlength}{1in}
\put(1.5, -1.75){\makebox(0,0)[tl]{\tone}}}\newpagetrue}
{\par\ifnewpage\antiphon\else\textit{Repeat Antiphon}\fi\newpagefalse}
该\AtBeginPage
宏来自bophook
包。问题是,这会将的内容放在\tone
背景中,因此文本会出现在它上面,并将其放在环境启动的页面上。有没有办法做这样的事情,除了将内容放在背景中\tone
,将它们插入到新页面开头的文本流中?
完成 MWE:
\documentclass[openany,12pt]{book}
\usepackage{bophook}
\usepackage{blindtext}
\usepackage{atbegshi}
\newif\ifnewpage\newpagefalse
\newenvironment{sungpsalm}[2]%
{\def\antiphon{#1}
\gdef\tone{#2}
\antiphon\par\tone\par
\AtBeginShipoutNext{
\AtBeginPage{%
\setlength{\unitlength}{1in}
\put(1.5, -1.75){\makebox(0,0)[tl]{\tone}}
}
\global\newpagetrue
\global\addtolength{\topmargin}{1in}
\global\addtolength{\textheight}{-1in}
}
}
{\par\ifnewpage\antiphon\else\textit{Repeat Antiphon}\fi\global\newpagefalse
\AtBeginShipoutNext{
\AtBeginPage{}
\global\addtolength{\topmargin}{-1in}
\global\addtolength{\textheight}{1in}}
}
\begin{document}
\begin{sungpsalm}{Some text to represent the antiphon. Normally this would be a snippet of music created using lilypond.}
{Some text to represent the psalm tone.}
\Blindtext
\end{sungpsalm}
\end{document}
编辑:在网上进一步搜索后,我找到了atbegshi
具有与 类似功能的包bophook
。试用这个包一段时间后,我发现使用这两个包可以解决一些问题。上面的 MWE 已被修改,只要\tone
新的 sungpsalm 环境不在前一个环境结束的同一页面上开始, 的外观就是正确的。由于页面大小方面的考虑,我的应用程序很可能会要求每个 sungpsalm 开始一个新页面(或几乎如此,前面只有一个节标题),因此我认为在这方面我必须接受什么。
但是,这仍然存在一个问题,即它\tone
被放置为背景图像,而不是直接放置在文本中。我发现了一种解决这个问题的巧妙方法,即在将 添加到页面时扩展\topmargin
(和缩小\textheight
)\tone
,然后在清除 时恢复它们。因此,虽然从\tone
技术上讲 仍然被放置在背景层上,但常规文本不会出现在其上方。我认为这是一种解决方法,而不是解决方案。如果有人对如何正确执行此操作有更好的想法,我将不胜感激。
答案1
不太清楚你想要什么。但这是我能解释你请求的最佳方式。根据你的逻辑总结的变更:
\def\tone{}
在序言中,以便对其进行定义。\gdef\tone{#2}
在环境的开头注释掉sungpsalm
,而是在预代码\AtBeginShipoutNext
中稍后将相同的定义放在宏的开头sungpsalm
。这样做的效果是,它不会出现\tone
在调用的第一页上,而只会出现在第二页及后续页面上。\AtBeginShipoutNext{\gdef\tone{}}
在sungpsalm
后代码中添加了一个,以重置\tone
后续页面上的宏(以便它仍然打印在环境关闭的页面上)。我添加了额外的文本和
sungpsalm
调用来测试上面的第 1-3 项。
这是 MWE
\documentclass[openany,12pt]{book}
\def\tone{}
\usepackage{bophook}
\usepackage{blindtext}
\usepackage{atbegshi}
\newif\ifnewpage\newpagefalse
\newenvironment{sungpsalm}[2]%
{\def\antiphon{#1}
%\gdef\tone{#2}
\antiphon\par\tone\par
\AtBeginShipoutNext{
\gdef\tone{#2}
\AtBeginPage{%
\setlength{\unitlength}{1in}
\put(1.5, -1.75){\makebox(0,0)[tl]{\tone}}
}
\global\newpagetrue
\global\addtolength{\topmargin}{1in}
\global\addtolength{\textheight}{-1in}
}
}
{\par\ifnewpage\antiphon\else\textit{Repeat Antiphon}\fi\global\newpagefalse
\AtBeginShipoutNext{
\AtBeginPage{}
\global\addtolength{\topmargin}{-1in}
\global\addtolength{\textheight}{1in}}
\AtBeginShipoutNext{%
\gdef\tone{}%
}
}
\begin{document}
\begin{sungpsalm}{Some text to represent the antiphon. Normally this would be a snippet of music created using lilypond.}
{Some text to represent the psalm tone.}
\Blindtext
\end{sungpsalm}
Now for something else
\Blindtext
get ready here it comes
\begin{sungpsalm}{Some text to represent the antiphon. Normally this would be a snippet of music created using lilypond.}
{Some text to represent the psalm tone.}
\Blindtext
\end{sungpsalm}
Now for something else
\Blindtext
\end{document}
答案2
在检查我的帐户时,我发现我从未发布过我为这个问题确定的答案,所以我现在就发布。迟做总比不做好。
我所做的是将 longtable 包与基于的补丁结合起来https://tex.stackexchange.com/a/202685/49327应用(以提供 longtable 中的偶数和奇数页眉和页脚)并使用一些标签,以便在设置最后一个页脚的内容之前比较环境开始和结束的页码。相关环境定义如下:
\usepackage{longtable}
\newbox\LT@oddhead
\newbox\LT@evenhead
\def\endoddhead{\LT@end@hd@ft\LT@oddhead}
\def\endevenhead{\LT@end@hd@ft\LT@evenhead}
\def\LT@head{\ifodd\c@page\LT@oddhead\else\LT@evenhead}
\newbox\LT@oddfoot
\newbox\LT@evenfoot
\def\endoddfoot{\LT@end@hd@ft\LT@oddfoot}
\def\endevenfoot{\LT@end@hd@ft\LT@evenfoot}
\def\LT@foot{\ifodd\c@page\LT@oddfoot\else\LT@evenfoot}
\newcounter{sungpsalm}
\newenvironment{sungpsalm}[2]
{%
\stepcounter{sungpsalm}%
\label{psalmstart-\thesungspalm}%
\def\do@antiphon{#1}%
\def\do@tone{#2}%
\begin{longtable}[l]{p{\textwidth}}%
\do@antiphon
\do@tone\endfirsthead
\do@tone\endevenhead
Continued next page\endoddfoot
\ifodd\getpagerefnumber{psalmstart-\thesungpsalm}%
\ifnum\getpagerefnumber{psalmend-\thesungpsalm}>\getpagerefnumber{psalmstart-\thesungpsalm}\relax%
\do@antiphon%
\else%
Repeat antiphon%
\fi%
\else%
\ifnum\getpagerefnumber{psalmend-\thesungpsalm}>\numexpr(\getpagerefnumber{psalmstart-\thesungpsalm}+1)\relax%
\do@antiphon%
\else%
Repeat antiphon%
\fi%
\fi%
\endlastfoot
}
{%
\label{psalmend-\thesungpsalm}
\end{longtable}%
}
我已经使用它好几年了,没有遇到任何大问题。