如何跟踪环境内的页面变化?

如何跟踪环境内的页面变化?

我正在尝试定义一个环境,它可以自动检测其中的材料何时移动到新页面,在新页面的顶部重新打印其中一个参数,并因此更改其关闭方式。到目前为止,这就是我想出的:

\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

不太清楚你想要什么。但这是我能解释你请求的最佳方式。根据你的逻辑总结的变更:

  1. \def\tone{}在序言中,以便对其进行定义。

  2. \gdef\tone{#2}在环境的开头注释掉sungpsalm,而是在预代码\AtBeginShipoutNext中稍后将相同的定义放在宏的开头sungpsalm。这样做的效果是,它不会出现\tone在调用的第一页上,而只会出现在第二页及后续页面上。

  3. \AtBeginShipoutNext{\gdef\tone{}}sungpsalm后代码中添加了一个,以重置\tone后续页面上的宏(以便它仍然打印在环境关闭的页面上)。

  4. 我添加了额外的文本和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}%
}

我已经使用它好几年了,没有遇到任何大问题。

相关内容