我尝试使用包中的页面在文档中插入页面\AtBeginShipoutNext
。atbegshi
但是,当调用的页面\AtBeginShipoutNext
包含\chapter{}
或\caption{}
命令时,我收到错误。
考虑一下这个MWE:
\documentclass[11pt]{book}
\usepackage{atbegshi}
\usepackage{lipsum}
\usepackage{float}
\begin{document}
\chapter{First Chapter}
\lipsum[1-4]
\begin{figure}[H]
\caption{This caption breaks everything}
\end{figure}
\lipsum[1-4]
\end{document}
命令
\AtBeginShipoutNext{
\AtBeginShipoutOriginalShipout\box\AtBeginShipoutBox
\stepcounter{page}\AtBeginShipoutOriginalShipout\hbox{}}
添加空白页并调整页码计数器。
当上述命令插入到MWE之前\chapter{First Chapter}
或之中时,就会出现问题。我收到错误\begin{figure}
! Undefined control sequence.\GenericError #4 \errhelp \@err@ l.15 \lipsum[1-4]
和
! Incomplete \iffalse; all text was ignored after line 23.
分别。
编辑:AtBeginShipoutNext
当当前页面包含引用(在本例中是章节的页码和标题)时,似乎会以某种方式破坏 .aux 文件
答案1
包atbegshi
提供钩子,当页面输出时。通常,页面输出后处理钩子时,可能会修改输出页面。那么 的含义\protect
就是 的原始含义,\protect
在钩子之前,LaTeX\noexpand
在输出例程中将其设置为 。包atbegshi
设置\protect
为\relax
(\set@typeset@protect
),以便允许用户修改输出页面内容,其通常含义为\protect
。
在这种情况下,页面已在钩子中输出,因此 的含义\protect
应该固定。否则 write whatsits( \contentsline
) 可能会中断。
另外,\AtBegShiDiscard
必须调用 来通知atbegshi
,以确保页面在挂钩之后不会被第二次运出。
具有空白的第二页的完整示例:
\documentclass[11pt]{book}
\usepackage{atbegshi}
\usepackage{lipsum}
\usepackage{float}
\begin{document}
\AtBeginShipoutNext{%
\begingroup
\let\protect\noexpand
\AtBeginShipoutOriginalShipout\box\AtBeginShipoutBox
\stepcounter{page}\AtBeginShipoutOriginalShipout\null
\endgroup
\AtBeginShipoutDiscard
}
\chapter{First Chapter}
\lipsum[1-4]
\begin{figure}[H]
\caption{This caption breaks everything}
\end{figure}
\lipsum[1-4]
\end{document}
包裹afterpage
与包相同的结果afterpage
:
\documentclass[11pt]{book}
\usepackage{afterpage}
\usepackage{lipsum}
\usepackage{float}
\begin{document}
\afterpage{\afterpage{\shipout\null}}
\chapter{First Chapter}
\lipsum[1-4]
\begin{figure}[H]
\caption{This caption breaks everything}
\end{figure}
\lipsum[1-4]
\end{document}