我有以下基于 atbegshi、tikz 和布尔开关的代码,用于插入带有侧边栏的页面:
\documentclass[a4paper]{article}
\usepackage[margin=1.0cm,noheadfoot,showframe]{geometry}
\usepackage{atbegshi,ifthen,tikz,lipsum}
\pagestyle{empty}
\newboolean{DrawSidebar}
\setboolean{DrawSidebar}{false}
\AtBeginShipout{\ifthenelse{\boolean{DrawSidebar}}{%
\begin{tikzpicture}[remember picture,overlay]%
\fill[red] (current page.north west) rectangle ++(5.0cm,-\paperheight);
\end{tikzpicture}%
}{}}
\begin{document}
\lipsum[1-10]
\setboolean{DrawSidebar}{true}
\newgeometry{left=6.0cm,right=1.0cm,top=1.0cm,bottom=1.0cm,noheadfoot}
\lipsum[1-15]
\setboolean{DrawSidebar}{false}
\restoregeometry
\lipsum[1-10]
\end{document}
这种方法效果很好,但是所有带有侧边栏的页面上的上边距和文本之间都存在不必要的间隙:
我可以通过注释掉tikzpicture
中的代码来消除间隙\AtBeginShipout
。所以我认为它与有关,这对tikzpicture
我来说相当令人惊讶,因为它是一个覆盖。
我该怎么做才能消除这个差距?
答案1
以下是可以产生所需结果的版本:
\documentclass[a4paper]{article}
\usepackage[margin=1.0cm,noheadfoot,showframe]{geometry}
\usepackage{atbegshi,ifthen,tikz,lipsum}
\pagestyle{empty}
\newboolean{DrawSidebar}
\setboolean{DrawSidebar}{false}
\AtBeginShipout{%
\setbox\AtBeginShipoutBox=\hbox{\ifthenelse{\boolean{DrawSidebar}}{%
\begin{tikzpicture}[remember picture,overlay]%
\fill[red] (current page.north west) rectangle ++(5.0cm,-\paperheight);
\end{tikzpicture}%
}{}%
\box\AtBeginShipoutBox
}%
}
\begin{document}
\lipsum[1-10]
\newgeometry{left=6.0cm,right=1.0cm,top=1.0cm,bottom=1.0cm,noheadfoot}
\setboolean{DrawSidebar}{true}
\lipsum[1-15]
\restoregeometry
\setboolean{DrawSidebar}{false}
\lipsum[1-10]
\end{document}
第一个修改是重置 中的当前发货箱\AtBeginShipout
。我们只需将当前箱子放入另一个箱子中,并在前面添加 TikZ 图片(如果需要)。
需要进行另一项修改:设置DrawSidebar
开关后您已经更改了页面几何形状。否则,当前页面发货时,覆盖图已经绘制完成,因此发货总是会提前一页。
我不完全清楚你的版本是怎么回事。可能是设置了方框,TikZ 图片被移到了下一页,导致输出中多了一个空行。至少这是我能想到的唯一合理的解释,说明为什么你的版本中叠加会出现在正确的页面上。