虽然我在自定义文档类中使用了 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}