不使用atbegshi宏包向\shipout添加钩子的方法研究

2020-07-18 14:21发布

## 编译环境 操作系统 * [x] Windows 7/8/10 * [ ] macOS * [ ] Linux `若需勾选,请把[ ]改成[x]` Tex发行版 * [x] TexLive `2...

## 编译环境 操作系统 * [x] Windows 7/8/10 * [ ] macOS * [ ] Linux `若需勾选,请把[ ]改成[x]` Tex发行版 * [x] TexLive `2020` * [ ] MikTeX `版本号` * [ ] CTeX `若需勾选,请把[ ]改成[x]` ## 我的问题 最近读完《The TeX Book》,想玩玩 `\shipout` 命令练手。于是自己给自己提一个需求——每页都要判断文字占用行高是否超过版心高的一半,如果是,则在版心下方空白处居中打印 “以下空白” 字样。 以下代码可以完成任务 ```tex \documentclass{article} \usepackage{lipsum} \makeatletter \output={\shipout\box255} \let\shipout@temp=\shipout \def\shipout{\shipout@hook\shipout@temp} \long\def\shipout@hook{% % \shipout@temp\vbox{% % baselineskip = \the\baselineskip, pagetotal = \the\pagetotal, pagegoal = \the\pagegoal % \par % \ifdim\pagetotal<.5\pagegoal % less then a half. % \else % more then a half. % \fi} \ifdim\pagetotal<.5\pagegoal \setbox255=\vbox to\pagegoal{\unvbox255 \vfill\hbox to\hsize{\hfill\Huge NULL\hfill}\vfill} \fi} \makeatother \begin{document} \lipsum \end{document} ``` 输出共 3 页 ![](https://wenda.latexstudio.net/data/attach/200718/xNmhfLVF.png) 取消 8 - 15 行的注释可以看到在独立一页中输出相关数据 目前的问题是,如果将第 4 行注释掉,根据书上说,TeX 将使用自己的例行程序。然而这导致后续自定义的钩子就不工作了,难道 (La)TeX 自己的例行程序没有使用 `\box255` 么? ![](https://wenda.latexstudio.net/data/attach/200718/3LBRNVOA.png)
1条回答
zhaochongbin
2020-07-18 23:25
问题已解决 ```tex \documentclass{article} \usepackage{lipsum} \makeatletter % \output={\shipout\box\@outputbox} \let\shipout@temp=\shipout \def\shipout{\shipout@hook\shipout@temp} \long\def\shipout@hook{% % \shipout@temp\vbox{% % baselineskip = \the\baselineskip, pagetotal = \the\pagetotal, pagegoal = \the\pagegoal % \par % \ifdim\pagetotal<.5\pagegoal % less than a half % \else % more than a half % \fi} \ifdim\pagetotal<.5\pagegoal \setbox\@outputbox=\vbox to\pagegoal{\unvbox\@outputbox \vfill\hbox to\hsize{\hfill NULL\hfill}\vfill} \fi } \makeatother \begin{document} \lipsum \end{document} ``` 经查验 `ltoutput.dtx` 源码发现,LaTeX2e 内部使用 `\@outputbox` 取代 `\box255`,因此只要将使用的 box 改为 `\@outputbox` 即可。 ![](https://wenda.latexstudio.net/data/attach/200718/1LQebkW8.png)