\newpage 是否能像 \AtBeginShipout 一样可靠地触发 shipout?

\newpage 是否能像 \AtBeginShipout 一样可靠地触发 shipout?

虽然我在自定义文档类中使用了 TeXlive 2016 和 LuaTeX、单列双面页面,但我相信这个问题几乎适用于所有内容:

我知道页面输出例程是异步的,我也知道为什么:这是因为直到布局引擎查看可能流向下一页的内容时,分页符才真正确定下来。

我的问题是:该\newpage命令是否能可靠地触发 shipout?换句话说,假设我在更大的文档中执行这样的操作:

\documentclass{article}
\usepackage{atbegshi}
\newif\ifmytestflag \mytestflagfalse
\AtBeginShipout{\mytestflagfalse}
\begin{document}
... some text.\mytestflagtrue
\newpage
HERE ... more text
\end{document}

我可以确定\mytestflag此处的 始终为假吗?我想在此处放置一个测试,并且必须正确设置标志。测试不能推迟到页面的后面;它必须位于顶部。

当然,我试过几个例子。看起来还不错。但我不知道我是否只是运气好。

注意:我绝对没有使用数学模式。

编辑:喝完另一杯咖啡后,我的大脑放松下来,我明白了:最简单的做法是\newpage通过添加一个清除标志的宏来重新定义。如此简单明了。然后我就不必担心什么时候\AtBeginShipout发生。但由于不是每个人都喜欢重新定义基本命令,也许他们想知道我最初问题的答案。

答案1

\newpage不一定会触发页面的输出:

  • 如果垂直列表为空,则不输出任何内容。
  • 或者它只是在双列布局中开始一个新列。

可以通过引用来实现测试,即同一页上是否多次调用宏。包zref-perpage提供了一个带有计数器的接口,该计数器在每页开始时重置。该方法至少需要两次 LaTeX 运行。示例文件:

\documentclass[a5paper]{article}
\usepackage{color}
\usepackage{lipsum}

\usepackage{zref-perpage}

\newcounter{mymacro}
\zmakeperpage{mymacro}
\newcommand*{\mymacro}{%
  \stepcounter{mymacro}%
  \ifnum\value{mymacro}=1 %
    % First usage of \mymacro on the page
    \textcolor{red}{[\themymacro]}%
  \else
    % Second or later usage of \mymacro on the page
    \textcolor{blue}{[\themymacro]}%
  \fi
}

\begin{document}
\mymacro~\lipsum[1]
\mymacro~\lipsum[2]
\mymacro~\lipsum[3]
\mymacro~\lipsum[4]
\mymacro~\lipsum[5]
\mymacro~\lipsum[6]
\mymacro~\lipsum[7]
\mymacro~\lipsum[8]
\end{document}

第 1 页第2页第 3 页

相关内容