ShipoutCurrentgrouplevel.tex
ShipoutCurrentgrouplevel.tex
—
TeX document,
1 KB (1866 bytes)
Zawartość pliku
\documentclass[a4paper,12pt]{article}
\usepackage[vmargin=1in]{geometry}
\usepackage{parskip}
\usepackage{verbatim}
\usepackage[ascii]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\makeatletter
\g@addto@macro\maketitle{%
\thispagestyle{empty}%
}
\providecommand*{\cs}[1]{%
\texttt{\textbackslash #1}%
}
\providecommand*{\eTeX}{%
$\m@th\varepsilon$-\TeX
}
\providecommand*{\xpackage}[1]{%
\textsf{#1}%
}
\newenvironment{code}{%
\quote
\verbatim
}{%
\endverbatim
\endquote
}
\makeatother
\title{%
Safe redefinition of \cs{shipout} (I)
using \eTeX's \cs{currentgrouplevel}%
}
\author{Heiko Oberdiek}
\date{27th April 2007}
\begin{document}
\maketitle
Goal: Redefine \cs{shipout} to do something with its box.
First we catch its box by \cs{setbox} and \cs{afterassignment}:
\begin{code}
\shipout := \afterassignment\@Test
\setbox\@Box=
\end{code}
There are two different cases:
\begin{code}
(a) \shipout\box0 -> \setbox\@Box=\box0 \@Test
(b) \shipout\vbox{...} -> \setbox\@Box=\vbox{\@Test ...}
\end{code}
In case (b) we want to postpone \cs{@Test} after the \cs{vbox} group
by \cs{aftergroup}. But how can we differentiate between these cases?
\eTeX's \cs{currentgrouplevel} helps:
\begin{code}
\shipout := \edef\@Level{\the\currentgrouplevel}
\afterassignment\@Test
\setbox\@Box=
\@Test := \ifnum\@Level<\currentgrouplevel
\expandafter\aftergroup
\fi
\@Output
\end{code}
The original \cs{shipout} ignores void boxes.
\begin{code}
\@Output := \ifvoid\@Box
\else
% do something with box \@Box
\fi
\@OrigShipout\box\@Box
\end{code}
(For completeness:)
\begin{code}
\newbox\@Box
\let\@OrigShipout=\shipout
\end{code}
This is one of the methods implemented by package \xpackage{atbegshi}.
\end{document}
Akcje Dokumentu
