配置:Windows11; TeXLive2024; VSCode; XeLaTeX
在学位论文中会有这么一种要求:中文摘要单页打印,英文摘要及其往后部分双面打印。
对此,想通过在中文摘要部分穿插生成空白页的方式,实现“又单又双”的效果。
如何在局部穿插生成空白页?
使用 atbegshi
宏包:
tse 上的一个方案(来源),但其只能对全文生效、无法设置作用域。
更确切的:无法在某个位置stop。其提供的 \AtBeginShipoutDiscard
命令会吞掉往后的所有内容。
\shipout
:\documentclass{article}
\usepackage{lipsum,zhlipsum}
\begin{document}
% 中文摘要部分间隔生成空白页
\begin{abstract}
\zhlipsum
\end{abstract}
% 英文摘要及其往后则恢复正常
\begin{abstract}
\lipsum
\end{abstract}
% ...
\end{document}
Thanks to deepseek(AI论坛秀了属于是),我在他给的答案基础上修改了一下,应该可以满足需求:
\documentclass[fontset=ubuntu]{ctexart}
\usepackage[margin=1in]{geometry}
\usepackage{lipsum,zhlipsum}
\usepackage{atbegshi}
\newif\ifinsertblankpage
\insertblankpagefalse
\let\oldabstract\abstract
\let\endoldabstract\endabstract
% 定义英文摘要环境
\newenvironment{enabstract}{%
\renewcommand\abstractname{Abstract}
\oldabstract
}{%
\endoldabstract \newpage
}
% 定义中文摘要环境,并启用插入空白页
\newenvironment{cnabstract}{%
\renewcommand\abstractname{摘要}
\insertblankpagetrue % 启用插入空白页
\oldabstract
}{%
\endoldabstract \newpage
\insertblankpagefalse % 关闭插入空白页
}
% 页面输出钩子:在中文摘要的每一页后插入空白页
\AtBeginShipout{%
\ifinsertblankpage
\AtBeginShipoutOriginalShipout\box\AtBeginShipoutBox % 输出当前页
\AtBeginShipoutOriginalShipout\null % 输出空白页
\fi
}
\begin{document}
% 中文摘要部分:每一页后自动插入空白页
\begin{cnabstract}
\zhlipsum[1-8] % 生成多页中文摘要
\end{cnabstract}
% 英文摘要及其往后部分:正常双面打印
\begin{enabstract}
\lipsum[1-12] % 生成多页英文摘要
\end{enabstract}
\end{document}
上述代码的效果是:
不过上面的代码会报一个警告:
LaTeX: Ignoring void shipout box.
The shipout box was voided by hook code.
应该是\AtBeginShipoutOriginalShipout\null
导致的,不过你原问题中atbegshi宏包作者Heiko Oberdiek都用了类似的实现,想来不是什么问题。
昨天看这条帖子有点冷清就没理了,直至刚准备睡才看到了新回答...
很巧,后来我也想到了设一个条件命令来控制是否insert,但搓实例时发现insert的时机不对,i.e.
于是又转手发了一个贴在 tse 上.
如今对比了您的代码,大概率是
\AtBeginShipout
的参数没写好的问题.感谢解惑. By the way, 钩子真难...
@u64726 哈哈哈,我也不熟悉hook,昨天也在tse上搜了很久(呜呜)
希望tse上有其他解答~
^_^
@u70550 出现了新问题:
\insertblankpagetrue
时无法使用hyperref
宏包的或者
abstract
宏包的addtotoc
选项来为摘要添加目录超链接,像是某种冲突.error message 均为:
然而,将
\phantomsection...
放在cnabstract
环境之后则无报错(当然,超链接也已失准),即:\insertblankpagefalse
时则恢复正常.根据 Ulrike Fischer 老师的回答上面的问题仍存在否(?)
解决了. 还得是用原生的钩子.
遇到新问题后,我在
atbegshi
包的仓库顺带提了个issue(之前还上头直接把问题抛在issue那了,被作者小dui了一下>_<),他额外还给了种不换只加的方法,i.e. 做一步展开:只不过,这会导致每次生成两张空白页而不是一张.
@u64726 谢谢你的事事有回应,为你的坚持点赞!我也学会了不少!
@u64726 不过我没太看懂他这个l3的方法应该放在哪里,他想表达的也许是
atbegshi
宏包现在已经过时并且被ltshipout
取代了,我也不太明白shipout/before
为何有两张空白页,但使用shipout/after
可行。在这里也存一下,作为你第二个问题的回复。好滴. Thank us both~