问题:如何编写运行控制序列的宏
\C
(例如,在页面或幻灯片上打印图形,a)在下一个分页符(或新幻灯片)之后,或 b)在下一个分页符(或新幻灯片)之前?
回答:我正在寻找通用方法,每个方法都配有一个简单的示例,以供学习。如果几个答案有用,赏金就会增加。(当然,我想回答问题的用户很可能已经拥有巨大的声誉。)
如果只适用于演示文稿、投影机或 powerdot,看看新框架在这种情况下如何成为用户输入的控制序列,这也能回答这个问题。不过,我对文章类特别感兴趣。
也许可以使用页码输出作为分页符的代理:定义宏以将页码计数器设为 #1,并重新定义页码打印算法以包含\c
在末尾。然后,另一个控制序列会隐藏或取消隐藏页码本身(如果需要),方法是在其位置打印一个白色方块?
如果\futurelet
必须使用,请建议如何以非脆弱的方式使用它!那将是一个答案。(它读取其所在组中的下一行,如果不存在新的帧控制序列,则不执行任何操作,否则\c
如果存在,则扩展到,依此类推。)
这有什么意义呢?为什么不像往常一样手动操作呢?问题最终涉及可能具有广泛用途的东西,即构建不断发展的技术图形动画关键帧,其中包含独立的 tikz 图形,并在必要时在面板中自动添加上下文特定的标记和描述。也就是说,不是每隔几秒钟就逐个执行几帧,这很繁琐。这样的文档可以批量提取为 .png 序列。
考虑一个文档,其内容是由 foreach 生成的一系列图形,如果某些参数的总和高于阈值,则某些图形不仅会每页显示一个,还会每几帧或每页显示一个,并且会根据一个特定参数的所有排列变化,并且在这种情况下会自动将某些图像或文本添加为标记。
我知道:文章或各种演示课程不适用于此:但那又怎样?这是可以做到的,而且我认为它相当有用。(录制音频,将来自多个此类文档的关键帧组合成视频,您就生成了一个特别精彩的讲座!)
提出这个问题的原因是,虽然一般的文档填充宏很简单,取决于图中一系列堆叠的
\foreach
s,但如果没有这个问题中要求的功能,它会迅速复杂化,因为相应的浮动文本标记和文本面板的 if-then 序列在多个框架中是相同的。我对核心宏的了解不够(但正在学习!)来构建这个特定的功能,不知道从哪里开始。也许这很容易,我很傻,竟然不知道这一点。
答案1
下面是使用\AddThispageHook
该everypage
包的功能的一个示例,正如您在编译时会看到的那样,它在第 1 页和第 2 页之间转换为红色字体,这是在实际调用点之后。
\documentclass{article}
\usepackage{everypage,lipsum,xcolor}
\begin{document}
\lipsum[1]
\AddThispageHook{\color{red}}
\lipsum[2-8]
\end{document}
如果您只在页面边界设置参数(如颜色更改),上述方法有效。它不适用于设置实际文本,因为在执行页面挂钩时页边距未正确设置。但是,还有其他方法可以使用类似的方法。
对于更复杂的事情,这将在第 3 页之后(第 4 页顶部)放置一个图形。这里的关键是使用页面钩子设置\gdef
将发生在页面边界,并允许在文档内测试该参数。我使用 进行测试\everypar
。
\documentclass{article}
\usepackage{everypage,lipsum,graphicx}
\def\Now{}
\begin{document}
\AddEverypageHook{\ifnum\value{page}=3\relax\gdef\Now{T}\else\gdef\Now{F}\fi}
\everypar{%
\if T\Now
\begin{figure}[t]
\centering\includegraphics[width=1in]{example-image-A}
\caption{Here is my page 4 figure}
\end{figure}
\gdef\Now{F}\fi
}
\lipsum[1-35]
\end{document}
最后,一个可比较的beamer
例子(不需要everypage
since\frame
发生,但每帧一次),我在第 2 帧告诉它在下一帧的开头插入一个图形。在这里,\everypar
我没有像在前面的例子中那样使用 进行测试,而是使用重新定义的\frame
来执行\Action
。
\documentclass{beamer}
\usepackage{graphicx}
\def\Action{\relax}
\let\svframe\frame
\def\frame{\svframe\Action\par\gdef\Action{\relax}}
\begin{document}
\begin{frame}
Frame 1
\end{frame}
\begin{frame}
\gdef\Action{\includegraphics[width=1in]{example-image}}%
Frame 2
\end{frame}
\begin{frame}
Frame 3
\end{frame}
\end{document}
答案2
FWIW,在 ConTeXt 中你可以使用\startpostponing
在特定页面上打印内容。例如,要将文本(或浮动文本)定位到下一页,请使用:
\starttext
....
\startpostponing[+1]
...
\stoppostponing
...
\stoptext
要将文本或浮动元素定位到特定页面(例如 20),请使用
\startpostponing[20]
...
\stoppostponing
\starttext
....
% Content must have at least 20 pages
....
\stoptext
实施是在page-pst.mkiv
。ConTeXt 的输出程序与 LaTeX 的输出程序不同,因此要将相同的实现应用于 LaTeX 需要了解 LaTeX 的输出程序。
答案3
标准 LaTeX 文档类中有一个便宜的答案:当周围没有其他浮点数(图形或表格)时,您可以使用浮点数来实现您想要的效果:
1)在下一页的开始处:
\begin{figure}[t] \C \end{figure}
2)在当前页面的末尾(即分页符之前)
\begin{figure}[b] \C \end{figure}
当你必须处理相互作用的浮点数时,事情恐怕会变得更加困难。