提问于:
浏览数:
1725
## 编译环境
操作系统
* [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 回答
0
问题已解决
```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)
你的回答
请登录后回答
你的回答将会帮助更多人,请务必认真回答问题。