The crop package

Melchior FRANZ

March 7, 1999

Abstract

This article describes the crop package^{1}, which provides different forms of cropmarks for trimming paper stacks, for camera alignment, and for visualizing the page dimensions. There are options for centering the page with respect to some physical paper size, for marking the vertical and horizontal middle axis, for mounting pages on a physical sheet, and for reflecting and inverting the whole document. Custom definitions are supported by loading a local configuration file and providing a mode definition command, which is demonstrated in an example.

The package was originally developed for needs of the Austrian Red Cross/Federal Province of Vienna/Department of Radiation Protection.

Contents

1 Introduction 1

2 How to use the package 2 2.1 The options . . . . . . . . 2 2.2 Loading . . . . . . . . . . 3 2.3 Controlling the package . 4 2.4 Defining your own mode . 4

3 How the package works 5 3.1 The kernel mechanism . . 5 3.2 The page info . . . . . . . 5 3.3 Compatibility . . . . . . . 5 4 The macros 5

4.1 Conventional options … 5 4.2 Special options handling . 6 4.3 Standard definitions … 6 4.4 The cam mode . . . . . . 7 4.5 The cross mode . . . . . . 8 4.6 The frame mode . . . . . 8 4.7 The kernel . . . . . . . . . 9 4.8 Mounting . . . . . . . . . 10 4.9 Page manipulation …. 10 4.10 Final settings . . . . . . . 11 4.11 A mount4 example …. 11

1 Introduction

It is convenient to print documents for smaller logical paper sizes on paper of the printer’s standard physical paper size. On the one hand this keeps from changing paper stacks, on the other hand it allows printing close to the logical paper edge and even outside the logical page.

For trimming a whole paper stack or ligning up the single pages on printing plates for photographical duplication a set of corner marks is required.

1This file has version number 1.3, last revised 1999/03/07.

I’d like to thank Rolf Niepraschk for his useful hints and suggestions, which influenced the package substantially.

2 How to use the package

2.1 The options

The following list shows all package options, whereby those marked with a little asterisk are conventional options that are only accessible, when the package is loaded (e. g. \usepackage[frame]{crop}). All other options can also be executed after loading the package, in which case they are to be stated as an optional argument(list) to the \crop command (e. g. \crop[frame]).

cam This mode provides four different marks (see figure 1), one for each corner, which show the logical paper edges without touching them and can thus be printed on every page. These marks are mainly thought for camera alignment. The \crop command selects this mode if no other mode is requested.

cross This mode provides four two inch wide crosses (see figure 1), one at each corner that touch the logical paper edge. That’s the reason why they should be printed on an extra page to be used as a cover page while trimming the whole paper stack. (This is also the Red Cross mode ;-)

frame This mode draws a frame around the logical page and is mainly thought for visualizing the logical paper dimensions.

off This ‘option’ makes only sense in connection with the \crop command (i. e. at runtime). It disables all markings and is selected by default if the package is input without options requested.

axes, noaxes — These options enable/disable the output of little marks which show the horizontal and vertical middle axis of the logical page and may be selected in addition to one of the above modes. These marks might be needed for punching. Notice that they are lost after trimming, since they lie outside the logical page. These marks are disabled by default.

mount1, mount2 — If more than one logical page is to be mounted on a physical sheet, you normally wouldn’t want marks to appear on the inner edges, where the pages touch each other. The mount2 mode prints only the outer marks. There’s also a mount1 mode that is selected by default. These commands take a number as an optional argument serving as a page offset. Type mount2 or mount2=0 for odd pages right and mount2=1 for odd pages left.^{2} Since further modes are likely to be document, driver, and printer dependent, no more modes are included. It is up to you, to implement such modes. (See a mount4 suggestion on page 11.)

∗a4center, a5center, b5center, lettercenter, legalcenter, executivecenter — Corresponding to the standard classes’ paper options there are center options that allow to center the logical output page on the respective physical printer paper.

2The ‘=’ notation may not look very intuitive at first glance, but other packages already use this notation for assignments and it was not desirable to introduce a new one.

[figure: “crop” 1999/3/8 page 3; “crop” 1999/3/8 page 3]

Figure 1: The upper right mark in cam and cross mode both with the page info.

∗landscapecenter — This option is to be set in addition to a center option if a document should be centered on ‘landscape oriented’ paper. It has nothing to do with the standard landscape option.

∗mirror This option reflects the whole document, provided that the ‘dvi’ output driver handles PS \special’s. It uses the standard graphics interfaces, if the document loads the graphics and/or the color package, or a matching interface file such as dvips.def. If no interface is defined, the package uses its internal macros. (This option is somewhat experimental, since I tested it only with dvips and a native PS printer, and with GhostScript under LINUX, where it worked properly. I’d like to know about your experience with other device drivers.)

∗invert This option lets the whole document be printed white onto black background, if the color package can be loaded and the document is output with an output device that is capable of executing PostScript commands. All color changing commands stated in the document are ignored.

2.2 Loading

Since all marks lie outside the logical page, the horizontal and vertical offset are to be set properly. Otherwise the marks are likely to be cut off by the DVI driver or the printer. The center commands center every logical page on the respective physical paper. The a4center command, for example, centers the page exactly on an ISO A4 sheet.

\documentclass[a5paper]{article}  \documentclass[a5paper]{article}
\usepackage[cam,a4center]{crop}   \usepackage[a4center]{crop}
\begin{document}                  \begin{document}
...                               ...
\end{document}                    \crop  % or: \crop[cross], etc.

                            ...
                            \end{document}

There’s, however, no harm in centering an A4 page on A4 paper, in which case both offsets are set to 0 pt (unless, of course, you have set \mag ≠ 1000).

2.3 Controlling the package

You get corner markings at every page shipped out after a cam, cross, or frame \crop mode request until you turn things off by typing \crop[off], or the actual group-

ing level or the document, of course, ends. Typing \crop without argument(s) is equivalent to typing \crop[cam,noaxes]. Axis marks appear only together with one of these modes. If you only want one cover page for trimming, make sure that a page is output in the scope of \crop, e. g.:

\newpage
{\crop[cross,axes]\null\newpage}

2.4 Defining your own mode

If you urgently need a funny mode, you can easily define it with only a couple of

\cropdef macros. The \cropdef command defines the mode switch. It takes as arguments: the name of a macro providing the page info (optional; enclosed in brackets), four macro names to be assigned to the upper left, the upper right, the lower left, and the lower right corner (each representing a picture with zero width and height, or \relax), and finally the mode name. The optional brackets may also be empty, if no page info is wanted, or contain the info code instead of a macro name.

\newcommand*\funnymarkA{%         % a little x
  \begin{picture}(0,0)
    \thinlines\unitlength1pt
    \put(-5,-5){\line(1,1){10}}
    \put(-5,5){\line(1,-1){10}}
  \end{picture}}
\newcommand*\funnymarkB{%         % a bullet
  \begin{picture}(0,0)
    \unitlength1pt
    \put(0,0){\circle*{5}}
  \end{picture}}
\newcommand*\funnyinfo{funny page info}
\cropdef[\funnyinfo]\relax\funnymarkA\relax\funnymarkB{funny}

You can select your own mode by typing \crop[funny].

The package tries to find a file ‘crop.cfg’ where local stuff is to be placed in. If you want to prevent your system from desperately seeking this file, you can speed it up by placing an empty configuration file in a directory, where TEX looks first.

Don’t hesitate to ask for special marks and modes—I’ll do what I can. Maybe some of the suggestions and requests are of common interest and will be included in future releases.

3 How the package works

3.1 The kernel mechanism

TEX outputs a page via the \shipout command. The crop package redefines \shipout to insert the requested marks before it outputs the page contents. It is carefully designed to coexist peacefully with other packages, which use the same method (like the everyshi package by Martin Schröder, from whom I have in fact borrowed some ideas).

3.2 The page info

Every page gets its page info, containing the jobname, the current date, and the page number placed at the upper left corner. The standard macro \CROP@@info, however, jumps first to the right corner.

3.3 Compatibility

The package works with all L^{A}TEX 2ε standard classes (tested with L^{A}TEX 2ε 1997/12/01), it does not work with plain TEX.

The crop package uses (and relies on) the internal L^{A}TEX tokens \hb@xt@,

\@height, \@depth, \@width, \z@, \z@skip, \p@, \@ifundefined, \c@page,
\@namedef, \@nameuse, \strip@pt, \count@, \dimen@, and \@for, all of which

are expected to keep their current meaning in future L^{A}TEX releases. The crop package will, however, be supported at least for some years, so you needn’t worry about it.

4 The macros

1 ⟨∗package⟩

 2 \NeedsTeXFormat{LaTeX2e}
 3 \ProvidesPackage{crop}[1999/03/07 v1.3 cropmarks  (mf)]

4.1 Conventional options

These options set the offset values to center a logical page on a physical sheet. Since the physical paper dimensions must not underlie a possible scaling, true dimensions are taken. The landscape option exchanges the \hoffset and \voffset dimension.

 4 \DeclareOption{landscapecenter}{%
 5 \def\CROP@center#1#2{\AtBeginDocument{\CROP@setoffset{#2}{#1}}}}
 6 \DeclareOption{a4center}{\CROP@center{297truemm}{210truemm}}
 7 \DeclareOption{a5center}{\CROP@center{210truemm}{148truemm}}
 8 \DeclareOption{b5center}{\CROP@center{250truemm}{176truemm}}
 9 \DeclareOption{lettercenter}{\CROP@center{11truein}{8.5truein}}
10 \DeclareOption{legalcenter}{\CROP@center{14truein}{8.5truein}}
11 \DeclareOption{executivecenter}{\CROP@center{10.5truein}{7.25truein}}

\CROP@setoffset \CROP@center This macro expects height and width of the physical sheet and sets \voffset and \hoffset to center the logical page on it. It is undefined at the end of the package to save (admittedly not very much) memory.

12 \newcommand*\CROP@setoffset[2]{%
13 \voffset#1\advance\voffset-\paperheight\voffset.5\voffset
14 \hoffset#2\advance\hoffset-\paperwidth\hoffset.5\hoffset}
15 \def\CROP@center#1#2{\AtBeginDocument{\CROP@setoffset{#1}{#2}}}

4.2 Special options handling

Every unknown option is passed to the macro \CROP@execopt.

16 \DeclareOption*{\CROP@execopt\CurrentOption}

\crop The \crop macro allows runtime option requests. Every argument of the optional argument list is passed to the macro \CROP@execopt. The options cam and noaxes are selected by default.

17 \newcommand*\crop[1][cam,noaxes]{%
18 \@for\CROP@@:=#1\do{\CROP@execopt\CROP@@}}

\CROP@execopt Every execution of this macro with an argument n leads to the execution of a macro \CROP@opt@n or a warning if no such exists. Optional arguments (separated by an equal sign) are cut off and stored in \CROP@@ before.

TEXnicians will recognize that the macro tolerates even arguments for options that are not prepared to handle arguments (e. g. cross=garbage), or more than one argument (e. g. mount2=1=garbage). This is neither a bug, nor a feature. It’s rather a consequence of the attempt to write simple and fast code. The reason why I didn’t make use of the keyval package that does all this (and much more) is, that the crop package shouldn’t be dependent on any further package (except L^{A}TEX, of course).

19 \newcommand*\CROP@execopt[1]{%
20 \def\CROP@##1=##2=##3\@nil{\def\CROP@{##1}\def\CROP@@{##2}}%
21 \expandafter\CROP@#1==\@nil%
22 \@ifundefined{CROP@opt@\CROP@}%
23  {\PackageWarning{crop}{Requested option `#1' not provided}}%
24  {\@nameuse{CROP@opt@\CROP@}}}

\cropdef The \cropdef macro defines a mode switch (see section 2.4).

25 \newcommand*\cropdef[6][\CROP@@info]{%
26 \@namedef{CROP@opt@#6}{%
27  \CROP@on
28  \def\CROP@info{#1}%
29  \let\CROP@ulc#2
30  \let\CROP@urc#3
31  \let\CROP@llc#4
32  \let\CROP@lrc#5}}

4.3 Standard definitions

\CROP@@vaxis \CROP@@haxis The standard definitions for the axes option. The \CROP@@vaxis macro must have zero height and depth.

33 \newcommand*\CROP@@vaxis{%
34 \hfil
35 \setbox\z@\hbox{\vtop{\hrule\@height12\p@\@depth-2\p@\@width.4\p@
36  \vskip\paperheight\vskip4\p@

37  \hrule\@height\z@\@depth10\p@\@width.4\p@}}%
38 \ht\z@\z@ \dp\z@\z@ \box\z@
39 \hfil}
40 \newcommand*\CROP@@haxis{%
41 \vfil
42 \hb@xt@\paperwidth{%
43  \llap{\vrule\@height.2\p@\@depth.2\p@\@width10\p@\hskip2\p@}%
44  \hfil
45  \rlap{\hskip2\p@\vrule\@height.2\p@\@depth.2\p@\@width10\p@}}%
46 \vfil}

\CROP@@info This macro prints the jobname, the current date, and the page number at the upper right corner. (In fact it prints it at the upper left corner, but the first thing the macro does is jumping to the right.)

47 \newcommand*\CROP@@info{%
48 \hskip\paperwidth\hskip12\p@
49 \raise12\p@\hbox{\vbox{%
50  \hbox{``\jobname''\strut}%
51  \hbox{\the\year/\the\month/\the\day\strut}%
52  \hbox{page \thepage\strut}}}}

4.4 The cam mode

The following four macros provide different marks for the cam mode. Since they do not affect the logical page by keeping distance from its edges, they may be printed on every single output page.

\CROP@@ulc The cam mode corner mark for the upper left corner.

53 \newcommand*\CROP@@ulc{%
54 \begin{picture}(0,0)\unitlength\p@\thinlines
55 \put(-30,0){\circle{10}}
56 \put(-30,-5){\line(0,1){10}}
57 \put(-35,0){\line(1,0){30}}
58 \put(0,30){\circle{10}}
59 \put(-5,30){\line(1,0){10}}
60 \put(0,35){\line(0,-1){30}}
61 \end{picture}}

\CROP@@urc The cam mode corner mark for the upper right corner.

62 \newcommand*\CROP@@urc{%
63 \begin{picture}(0,0)\unitlength\p@\thinlines
64 \put(30,0){\circle{10}}
65 \put(30,-5){\line(0,1){10}}
66 \put(35,0){\line(-1,0){30}}
67 \put(0,30){\circle{10}}
68 \put(-5,30){\line(1,0){10}}
69 \put(0,35){\line(0,-1){30}}
70 \end{picture}}

\CROP@@llc The cam mode corner mark for the lower left corner.

71 \newcommand*\CROP@@llc{%
72 \begin{picture}(0,0)\unitlength\p@\thinlines
73 \put(-30,0){\circle{10}}

74 \put(-30,-5){\line(0,1){10}}
75 \put(-35,0){\line(1,0){30}}
76 \put(0,-30){\circle{10}}
77 \put(-5,-30){\line(1,0){10}}
78 \put(0,-35){\line(0,1){30}}
79 \end{picture}}

\CROP@@lrc The cam mode corner mark for the lower right corner.

80 \newcommand*\CROP@@lrc{%
81 \begin{picture}(0,0)\unitlength\p@\thinlines
82 \put(30,0){\circle{10}}
83 \put(30,-5){\line(0,1){10}}
84 \put(35,0){\line(-1,0){30}}
85 \put(0,-30){\circle{10}}
86 \put(-5,-30){\line(1,0){10}}
87 \put(0,-35){\line(0,1){30}}
88 \end{picture}}

\CROP@opt@cam Define the cam mode switch with four different marks.

89 \cropdef\CROP@@ulc\CROP@@urc\CROP@@llc\CROP@@lrc{cam}

4.5 The cross mode

\CROP@@cross This macro provides a two inch wide cross.

90 \newcommand*\CROP@@cross{%
91 \begin{picture}(0,0)\unitlength1in\thinlines
92  \put(-1,0){\line(1,0){2}}
93  \put(0,-1){\line(0,1){2}}
94 \end{picture}}

\CROP@opt@cross Define the cross mode switch with four times the same mark.

95 \cropdef\CROP@@cross\CROP@@cross\CROP@@cross\CROP@@cross{cross}

4.6 The frame mode

\CROP@@frame The frame mode draws a simple frame around the logical page. The respective mark is designed to be used in the upper left corner. Since graphics commands take numbers without dimensions, \paperwidth and -height are transformed to numbers (representing printer’s points). This is done by stripping off the unit pt.

96 \newcommand*\CROP@@frame{%
97 \begin{picture}(0,0)\unitlength\p@\thinlines
98  \put(0,0){\line(1,0){\strip@pt\paperwidth}}
99  \put(0,0){\line(0,-1){\strip@pt\paperheight}}
100  \put(\strip@pt\paperwidth,0){\line(0,-1){\strip@pt\paperheight}}
101  \put(0,-\strip@pt\paperheight){\line(1,0){\strip@pt\paperwidth}}
102 \end{picture}}

\CROP@opt@frame Define the frame mode switch with only one mark. (The other corners may

\relax.)
103 \cropdef\CROP@@frame\relax\relax\relax{frame}

4.7 The kernel

\CROP@shipout \CROP@ship \CROP@@ship \CROP@shiplist These macros redefine the TEX primitive \shipout to insert the contents of the macro \CROP@@@ship on top of the box which contains the page contents ready for output, after which the original \shipout command is executed.

104 \let\CROP@shipout\shipout
105 \renewcommand*\shipout{\afterassignment\CROP@ship\setbox\@cclv=}
106 \newcommand*\CROP@ship{%
107 \ifvoid\@cclv\expandafter\aftergroup\fi\CROP@@ship}
108 \newcommand*\CROP@shiplist{\CROP@@@ship\unvbox\@cclv}
109 \newcommand*\CROP@@ship{\CROP@shipout\vbox{\CROP@shiplist}}

\CROP@shipadd This macro adds a page manipulation command to the shiplist, which gets every ready page as argument and may change it somehow.

110 \newcommand*\CROP@shipadd[1]{\begingroup
111 \toks@\expandafter{\expandafter#1\expandafter{\CROP@shiplist}}%
112 \xdef\CROP@shiplist{\the\toks@}%
113 \endgroup}

\CROP@kernel \CROP@kernel essentially contains a \vbox with zero width and height. The \CROP@every command—which normally equals \relax—allows to insert commands that modify the behaviour of the selected mode (see the options mount1 and mount2).

114 \newcommand*\CROP@kernel{\color@setgroup
115 \vbox to\z@{\vskip-1in
116  \hb@xt@\z@{\hskip-1in
117  \CROP@every
118  \vbox to\paperheight{%
119  \hb@xt@\paperwidth{%
120  \setbox\z@\hbox{\normalfont\CROP@info}%
121  \ht\z@\z@ \dp\z@\z@ \wd\z@\z@ \box\z@
122  \CROP@ulc\CROP@uedge\CROP@urc}%
123  \CROP@ledge
124  \hb@xt@\paperwidth{%
125  \CROP@llc\hfil\CROP@lrc}}%
126  \hss}%
127 \vss}\color@endgroup}

\CROP@on \CROP@@@ship \CROP@opt@off These macros start and stop the kernel mechanism.

128 \newcommand*\CROP@on{\let\CROP@@@ship\CROP@kernel}
129 \newcommand*\CROP@opt@off{\let\CROP@@@ship\relax}
\CROP@opt@axes \CROP@opt@noaxes \CROP@uedge \CROP@ledge Enable and disable the output of axis marks.
130 \newcommand*\CROP@opt@axes{%
131 \let\CROP@uedge\CROP@@vaxis
132 \let\CROP@ledge\CROP@@haxis}
133 \newcommand*\CROP@opt@noaxes{%
134 \let\CROP@uedge\hfil
135 \let\CROP@ledge\vfil}

4.8 Mounting

\CROP@opt@mount1 \CROP@opt@mount2 Since \newcommand doesn’t allow macro names to contain non-letters, we need a somewhat strange construction using \csname, \endcsname, and \expandafter. \@namedef would have worked, too, but it would not have made a check for redefinitions.

136 \expandafter\newcommand\expandafter*\csname CROP@opt@mount1\endcsname
137 {\let\CROP@every\relax}
138 \newcount\CROP@offset
139 \expandafter\newcommand\expandafter*\csname CROP@opt@mount2\endcsname
140 {\CROP@offset=\ifx\CROP@@\empty\z@\else\CROP@@\fi
141 \def\CROP@every{\count@\c@page
142  \advance\count@\CROP@offset
143  \ifodd\count@
144  \let\CROP@ulc\relax\let\CROP@llc\relax
145  \else
146  \let\CROP@urc\relax\let\CROP@lrc\relax\let\CROP@info\relax
147  \fi}}

4.9 Page manipulation

\CROP@reflect \CROP@setps The mirror option adds this command to the shiplist, after which \CROP@reflect gets every output page and puts it in a reflected box. If no interface macro \Gin@PS@raw can be found, the package command \CROP@ps is used to output raw PS commands.

148 \DeclareOption{mirror}{%
149 \AtBeginDocument{\CROP@shipadd\CROP@reflect\CROP@setps}}
150 \newcommand*\CROP@reflect[1]{%
151 \vbox to\z@{\vskip-1in\hb@xt@\z@{\hskip-1in
152  \CROP@ps{gsave currentpoint}\kern\paperwidth
153  \CROP@ps{currentpoint}\hss}\vss}%
154 \CROP@ps{translate -1 1 scale neg exch neg exch translate}%
155 \vbox{#1}%
156 \CROP@ps{grestore}}
157 \newcommand*\CROP@setps{%
158 \ifx\Gin@PS@raw\undefined
159  \PackageWarning{crop}{internal PostScript interface used}%
160  \newcommand*\CROP@ps[1]{\special{ps: ##1}}%
161 \else
162  \PackageInfo{crop}{graphics/color PostScript interface used}{}%
163  \let\CROP@ps\Gin@PS@raw
164 \fi
165 \let\CROP@setps\undefined}

\CROP@invert The invert option simply switches to black background and white text, after which it disables all color switching commands.

166 \DeclareOption{invert}{%
167 \AtEndOfPackage{\RequirePackage{color}}%
168 \AtBeginDocument{\CROP@invert}}
169 \newcommand*\CROP@invert{%
170 \ifx\color\undefined
171  \PackageWarning{crop}%

2 1
0 3

Figure 2: Possible mount4 arrangement

172  {The `color' package could not be loaded,^^J%
173  so I'm ignoring the `invert' option}%
174 \else
175  \pagecolor{black}\color{white}%
176  \newcommand\CROP@color[2][]{}%
177  \DeclareRobustCommand\color{\CROP@color}%
178  \DeclareRobustCommand\pagecolor{\CROP@color}%
179  \DeclareRobustCommand\textcolor{\CROP@color}%
180  \let\normalcolor\relax
181 \fi
182 \let\CROP@invert\undefined}

4.10 Final settings

Switch off marks and axes, set one page per sheet, load the local configuration file, and process the requested options. Finally: Exit.

Notice that we cannot simply use \ExecuteOptions to preselect options off, noaxes, and mount1, because it does not accept default options declared with

\DeclareOption*.
183 \crop[off,noaxes,mount1]
184 \InputIfFileExists{crop.cfg}%
185 {\PackageInfo{crop}{Local config file crop.cfg used}}{}
186 \ProcessOptions
187 \endinput

188 ⟨/package⟩

4.11 A mount4 example

Since a mount4 mode is likely to be subject to specific local needs, there’s only a suggestion provided, which supports a page arrangement as shown in figure 2. First of all \CROP@offset is set to the value of the (optional) argument or zero. Then \CROP@every is defined first to set \count@ to the page number increased by this offset: p = pagenumber + offset.

\expandafter\newcommand\expandafter*\csname CROP@opt@mount4\endcsname
  {\CROP@offset=\ifx\CROP@@\empty\z@\else\CROP@@\fi
  \def\CROP@every{\count@\c@page
    \advance\count@\CROP@offset

Now bits 0 and 1 are checked via \ifodd to get p modulo 4, after which the respective marks are deleted. The comments in the example use for simplicity C-Notation in which ‘%’ is the modulo or remainder operator, ‘==’ the equal, and ‘||’ the logical (inclusive) OR operator.

\ifodd\count@                         %% if (p % 4 == 1 || p % 4 == 3)
\let\CROP@ulc\relax\let\CROP@llc\relax
\divide\count@2 \ifodd\count@       %%    if (p % 4 == 3)
  \let\CROP@urc\relax
  \let\CROP@info\relax
\else                               %%    if (p % 4 == 1)
  \let\CROP@lrc\relax
\fi
\else                                 %% if (p % 4 == 0 || p % 4 == 2)
\let\CROP@urc\relax\let\CROP@lrc\relax
\let\CROP@info\relax
\divide\count@2 \ifodd\count@       %%    if (p % 4 == 2)
  \let\CROP@llc\relax
\else                               %%    if (p % 4 == 0)
  \let\CROP@ulc\relax
\fi
\fi}}