% \iffalse
%% File: crop.dtx Copyright (C) 1998--2017 Melchior FRANZ
%
%<*preamble>
%
%
%
% on Unix/Linux just run "make" to get the style file and the documentation;
% else generate the driver crop.ins (if you don't already have it):
%
%     $ latex crop.dtx
%
% Now generate the style file:
%
%     $ tex crop.ins
%
% And finally to produce the documentation run LaTeX three times:
%
%     $ latex crop.dtx
%
%
%
%
%
%
%$
%% ====================================================================
%%  @LaTeX-package-file{
%%     author          = "Melchior FRANZ",
%%     version         = "1.10.2",
%%     date            = "05 Jun 2020",
%%     filename        = "crop.dtx",
%%     address         = "Melchior FRANZ
%%                        Rieder Hauptstrasse 52
%%                        A-5212 SCHNEEGATTERN
%%                        AUSTRIA",
%%     URL             = "https://github.com/rrthomas/crop/",
%%     email           = "rrt@sc3d.org",
%%     codetable       = "ISO/ASCII",
%%     keywords        = "cropmarks, frame, mirror, rotate, invert",
%%     supported       = "yes",
%%     docstring       = "This document describes the crop package, which
%%                        provides different forms of crop marks 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
%%                        mounting pages on a physical sheet, for
%%                        reflecting and inverting the whole document or
%%                        printing it upside-down, and for suppressing
%%                        either text or graphics output.",
%%  }
%% ====================================================================
%
% COPYRIGHT NOTICE:
% This package is free software that can be redistributed and/or modified
% under the terms of the LaTeX Project Public License as specified
% in the file macros/latex/base/lppl.txt on any CTAN archive server.
%
%</preamble>
%
%
%<*batchfile>
\begin{filecontents}{crop.ins}
\def\batchfile{crop.ins}
\input docstrip.tex
\askforoverwritefalse
\keepsilent
\generate{\file{crop.sty}{\from{crop.dtx}{package}}}
\endbatchfile
\end{filecontents}
%</batchfile>
%
%
%
%<*driver>
\def\fileversion{1.10.2}
\def\filedate{2020/06/05}
\documentclass{ltxdoc}
\usepackage{hyperref}
\hypersetup{
    bookmarksopen,
    colorlinks,
    pdftitle={The crop package},
    pdfauthor={Melchior FRANZ},
    pdfkeywords={crop marks, mirror, invert, center}
}
\usepackage[pdftex]{graphicx,color}
%
%
%
\newcommand*\option{\textsf}
\newcommand*\package{\texttt}
\newcommand*\program{\texttt}
\newcommand*\person{\textsc}
\newcommand*\itemfont{\sffamily}
\newcommand*\versal[1]{\textsc{\small#1}}
\newcommand*\CD{\versal{CD}}
\newcommand*\PS{\versal{PS}}
\newcommand*\DVI{\versal{DVI}}
\newcommand*\A{\versal{A4}}
\newcommand*\ISO{\versal{ISO-A4}}
\newcommand*\POSTSCRIPT{\textsc{PostScript}}
\newcommand*\CROP{\package{crop}}
% (the following two are for development versions ONLY!   :-)
\newcommand*\FIXME{\marginpar{\Huge FIXME}\message{<FIXME>}\shop\stop}
\newcommand*\BS{\marginpar{\Huge BULLSHIT!}\show\stop}
%
%
\IfFileExists{crop.sty}
  {\usepackage{crop}[2001/11/16]\let\CROPSTYfound\active}
  {\GenericWarning{crop.dtx}
    {Package file `crop.sty' not found (One picture will be missing.^^J
    Generate `crop.sty' by (La)TeXing `crop.ins' and
    process `crop.dtx' again.)^^J}}
%
%
\newenvironment{labeling}[1]
  {\list{}{\settowidth{\labelwidth}{\textbf{#1}}
  \leftmargin\labelwidth\advance\leftmargin\labelsep
  \def\makelabel##1{\textbf{##1}\hfil}}}{\endlist}
%
%
\newenvironment{example}[1][.9\textwidth]
  {\par\medskip\begin{tabular}{p{#1}l}}
  {\end{tabular}\noindentafter\medbreak}
%
\makeatletter
\newcommand*\noindentafter{\@nobreaktrue\everypar{{\setbox\z@\lastbox}}}
\makeatother
%
% ^^A \RecordChanges
%
\begin{document}
\hfuzz.6pt
\setcounter{tocdepth}{2}
\DocInput{crop.dtx}
\end{document}
%</driver>
% \fi
%
%
% \CheckSum{1098}
% \CharacterTable
%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%   Digits        \0\1\2\3\4\5\6\7\8\9
%   Exclamation   \!     Double quote  \"     Hash (number) \#
%   Dollar        \$     Percent       \%     Ampersand     \&
%   Acute accent  \'     Left paren    \(     Right paren   \)
%   Asterisk      \*     Plus          \+     Comma         \,
%   Minus         \-     Point         \.     Solidus       \/
%   Colon         \:     Semicolon     \;     Less than     \<
%   Equals        \=     Greater than  \>     Question mark \?
%   Commercial at \@     Left bracket  \[     Backslash     \\
%   Right bracket \]     Circumflex    \^     Underscore    \_
%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%   Right brace   \}     Tilde         \~}
%
%
%
%
%
% \title{The \CROP\ package}
%
% \author{Melchior \textsc{FRANZ}}
% \date{Nov 19, 2017}
% \maketitle
%
%
% \changes{v1.0}{1998/05/20}{Initial version}%
%
% \changes{v1.1a}{1998/10/20}{`smash replaced; The crop marks
%   were displaced, when the package was used together with the
%   \texttt{amsmath} package (V1.2c), which redefines the \LaTeX\ smash
%   command to have a different meaning. Although, this is definitely a
%   bug in the \texttt{amsmath} design, we do no longer use
%   `smash. This problem was kindly reported by \person{Pauli Viljamaa.}}%
%
% \changes{v1.2}{1998/12/07}{options `mirror' and `invert' added
%   on suggestion by \person{Rolf Niepraschk.}}%
%
% \changes{v1.3}{1999/03/07}{center the logical paper `AtBeginDocument'
%   instead of immediately; postamble changed slightly; `uppercase
%   removed from info}
%
% \changes{v1.3a}{1999/05/15}{copyright complies with the LPPL; code unchanged}
%
% \changes{v1.4}{2000/02/02}{options `rotate' (suggested by \person{Rolf}) and
%   `info/noinfo' (requested by \person{Anshuman Pandey}) added}
%
% \changes{v1.5}{2001/10/07}{*center options replaced by `center' and paper size
%   options; options `dvips', `pdftex', `graphics', `nographics', `notext',
%   `color', `horigin' and `vorigin' added; new info line with time stamp;
%   some of the improvements were suggested by Cpt.~\person{Leszek Flis}}
%
% \changes{v1.6}{2001/11/16}{font option added; dvips/pdftex/vtex options
%   changed; nographics enabled for pdftex; fixed a nasty bug that
%   disallowed setting the physical paper size in the config file---thanks
%   to \person{Stefan Becuwe} for reporting this.}
%
% \changes{v1.7}{2002/05/14}{odd/even/width/height options added; better
%   geometry.sty compatibility; adopting `stockwidth/`stockheight}
%
% \changes{v1.8}{2003/05/10}{removed all the `changes entries except those
%   in the preamble (crop is in CVS since v1.4, anyway); rewrote kernel;
%   added color support; fixed a nasty bug; better driver detection}
%
% \changes{v1.9}{2003/05/20}{don't create command sequences by merely
%   checking for them}
%
% \changes{v1.10}{2017/11/19}{fix dimensions of a1, a2, a5 and a6 paper; add
%   support for LuaTeX.}
%
%
% \begin{abstract}
% This article describes the \CROP\ package^^A
%^^A
% \footnote{This file has version number \fileversion, last revised
% \filedate.\\I'd like to thank \person{Rolf Niepraschk} for his useful
% hints and suggestions, which influenced the package substantially.
% A big thank you also goes to \person{Walter Schmidt} for his extensive
% tests and his expertise on compatibility issues with different devices.}^^A
%^^A
% , which provides different forms of crop marks for trimming paper
% stacks, for camera alignment and for visualizing the page dimensions.
% There are options for centering the document page on the paper sheet,
% for mounting pages on a physical sheet, for reflecting and inverting
% the whole document or printing it upside-down, and for suppressing
% either text or graphics output.
%
% The package was originally developed for needs of the
% Austrian Red Cross\slash Federal Province of Vienna\slash
% Department of Radiation Protection.
% \end{abstract}
%
%
%
%
%
% {\setlength\parskip{0pt}\tableofcontents}
% \addtocontents{toc}{\protect\begin{multicols}{2}}
%
%
% \section{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 lining up the single pages on
% printing plates for photographical duplication a set of corner marks
% is required.
%
%
%
%
%
% \section{How to use the package}
%
% \subsection{Conventional options}
% \label{sec:conventional}
%
% These options may only be used in the preamble and have to be stated
% as arguments to the |\usepackage| command (as in |\usepackage[mirror]{crop}|).
%
% \begin{labeling}{\indent\indent}
% \item[\itemfont a0, a1, a2, a3, a4, a5, a6,
%    b0, b1, b2, b3, b4, b5, b6, letter, legal, executive]\hfill\break
%    These options declare the printing paper dimensions. One of them should be
%    specified if the \option{center} option or one of the options \option{dvips},
%    \option{pdftex}, \option{luatex} and \option{vtex} is used. The size options
%    do not define the logical document page size! See
%    section~\ref{sec:custom-logical} for how to achieve this.
%
% \item[\itemfont width, height]---
%    Instead of using one of the pre-defined paper formats as described
%    above, you can also set the physical paper dimensions directly. You may omit
%    the `|true|' specifier if you don't plan to scale the document.
%    Example: |\usepackage[cam,width=10truecm,height=13truecm]{crop}|
%
% \item[\itemfont center]
%    This option centers the logical document page on the physical printer paper
%    and therefore requires that you declare the sheet size properly. Write,
%    for example, |\usepackage[cam,a4,center]{crop}| to center a document of any size
%    on \ISO\ sheets.
%
% \item[\itemfont landscape]---
%    Use this option in addition to the \option{center} option if you want
%    to center a document on \emph{landscape oriented} paper. It has nothing
%    to do with \LaTeX's |landscape| document class option.
%
% \item[\itemfont dvips, pdftex, pdflatex, luatex, lualatex, vtex, nodriver]---
%   If you are working with \program{dvips}, \program{pdftex},
%   \program{luatex} or \program{vtex}
%    you may want to pass the dimensions of the paper that you are planning to print on to
%    the respective driver program. Especially viewer programs like \program{evince}
%    or \program{xpdf} make use of this \emph{bounding box} information. Unfortunately,
%    this can't be done in a generic way---there's no standard. These options select
%    driver specific methods to set the paper size and to rotate and reflect a page.
%
%    The \CROP\ package tries to find out by itself which driver to use.
%    You find its choice mentioned in the log file. Additionally, you can
%    \emph{suggest} (|[dvips]|) or \emph{enforce} (|[dvips!]|) one of the drivers. In the
%    latter case you only have to add an exclamation point to the driver
%    option. The difference is, that a suggestion may get overruled by the
%    package. Assume you have asked for |[dvips]|, but run the document file
%    through \program{pdflatex}. In this case \CROP\ will automatically use
%    the \option{pdflatex} driver. You can also force \CROP\ not to use any
%    of the drivers by requesting the \option{nodriver} option.
%    \option{pdflatex} is a synonym for \option{pdftex}, and \option{lualatex}
%    is a synonym for \option{luatex}.
%
% \item[\itemfont mirror]
%    This option reflects the whole document, provided that the selected output
%    driver supports the \package{graphics} package's |\reflectbox| command.
%    It doesn't have any effect on the \DVI\ file.
%
% \item[\itemfont rotate]
%    Rotates the document by 180\(^\circ\) so that it appears upside-down.
%    This may be useful to circumvent problems with printers, which do not print
%    close enough to the lower paper edge due to their paper feed mechanism.
%
% \item[\itemfont invert]
%    Lets the whole document be printed white onto black background,
%    if the \package{color} package can be loaded and the document is output with a
%    color aware device. All further color changing commands stated in the document
%    are disabled. This option doesn't invert pictures, nor does it really swap
%    text and paper color. Red text on green will still become white
%    text on black. \option{invert} is stronger than \option{notext}.
%
% \item[\itemfont notext]---
%    This option uses the \package{color} package to turn text to white
%    color, after which all further color switching commands are disabled. This
%    makes the text disappear from the printout, although it remains in the
%    output file. See the description of the options \option{nographics} and
%    \option{graphics} on page~\pageref{graphics} for an explanation.
%    This option is ignored if option \option{invert} was also requested.
% \end{labeling}
%
%
%
%
%
%
%
% \subsection{Runtime options}
%
% These options may be used in the preamble like the `conventional' options
% (see section~\ref{sec:conventional}), but also as optional arguments to the
% |\crop| command everywhere in the document (as in |\crop[frame]|). Using
% this command without options implies |\crop[cam,noaxes]|.
%
% \begin{labeling}{\indent\indent}
% \item[\itemfont cam]
%    This mode provides four different marks (see figure \ref{fig:marks}),
%    one for each corner. They indicate 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.
%
% \item[\itemfont cross]
%    This mode provides four 4~cm wide crosses (see figure
%    \ref{fig:marks}), one at each corner, that touch the logical paper
%    edge. That's why they should be printed on an extra page
%    that will be used as a cover page while trimming the whole paper stack.
%    (This is also the \emph{Red Cross} mode ;-)
%
% \item[\itemfont frame]
%    This mode draws a frame around the logical page and is mainly thought
%    for visualizing the document page dimensions.
%
% \item[\itemfont 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 requesting any of the marks.
%
% \item[\itemfont odd, even]---
%    Use these options to let the crop marks be put on odd\slash even pages only.
%    They automatically turn on \option{cam} marks if no other marks have been
%    requested. Note that only the page number is considered. If you have
%    two subsequent pages both with page number~1, and ask for the \option{odd}
%    option, then both pages will have marks.
%
% \item[\itemfont axes, noaxes]---
%    These options enable\slash disable the output of little marks that
%    indicate the logical page's horizontal and vertical middle axis and
%    may be selected in addition to one of the main modes. These marks
%    might be needed for punching. Note that they are lost after
%    trimming, since they lie outside the logical page.
%    These marks are disabled by default.
%
% \item[\itemfont info, noinfo]---
%    Print the page information consisting of filename, date, time, page number and page
%    index on every sheet (see figure~\ref{fig:marks}). The page index starts
%    with \#1 and is incremented with every page info line, hence being more
%    reliable than page numbers, which are not unique and may be negative or
%    contain letters. It can also be seen as a crop marks counter.
%    Pages without crop marks aren't counted. This page information is enabled
%    by default.
%
% \item[\itemfont font]
%    The page info line uses |\normalfont| by default. If you are typesetting
%    the document in non-latin glyphs or a decorative, but less legible font,
%    you may want to request a specific font for that info. Just assign
%    a font switching command like |\textsf| to the \option{font} option
%    parameter, leaving the initial backslash away: |[font=textsf]|. This
%    command may take one argument (like |\textsf{}|) or stand alone (like |\small|).
%    You can, of course, define a more complex command first, and assign that
%    one: |\newcommand*\infofont[1]{\textcolor{blue}{\textsf{\small#1}}}|
%    |\crop[font=infofont]|
%
% \item[\itemfont color]
%    You can set the color of crop marks, axes and info text with this
%    option, if the \package{color} package could be loaded.
%    The option takes only color names, as in |[color=red]|. See
%    the \package{color} package documentation for how to define custom colors.
%
% \item[\itemfont mount1, mount2]---
%    If more than one logical page is to be mounted on a physical sheet,
%    you normally don't want marks to appear on the inner edges, where
%    the pages touch each other.
%    The \option{mount2} option prints only the outer marks.
%    There's also a \option{mount1} option that is selected by default.
%    These commands take a number as an optional argument serving
%    as page offset. Type |mount2| or |mount2=0| for odd pages right
%    and |mount2=1| for odd pages left. Since further modes are likely
%    to be document, driver, and printer dependent, it is up to you to
%    implement them yourself. (See a \option{mount4} suggestion on page
%    \pageref{sec:mount4}.)
%
% \item[\itemfont horigin, vorigin]---
%    The top and left margin are by default 1~inch wide. This can be changed
%    using the dimensions |\oddsidemargin|, |\evensidemargin| and
%    |\topmargin|. It's more convenient, though, to let the |geometry| package
%    define all these and further parameters. The options \option{horigin} and \option{vorigin} only
%    move the marks and don't change the page contents. \emph{Using these options is almost
%    always a mistake, so use them only as a last resort!} Both options take a
%    (mandatory) dimension. These dimensions describe the way from the reference point---the
%    upper left corner of the text block---to the upper left corner of the page in
%    a Cartesian coordinate system.
%    As both |horigin| and |vorigin| are by default $-1$~inch, you would for
%    example write |horigin=-.6in| to move the marks by 0.4~inch to the right.
%
% \item[\itemfont graphics, nographics]---
%    \label{graphics}
%    Color printouts are often more expensive than black-and-white ones, while
%    their text quality is sometimes reduced. Therefore it may be desirable to create
%    two versions of a document, one with only text and one with only
%    graphics. Now you can feed the concerned pages to a color printer to
%    print the \option{notext} version, and then to a mono laser printer with the
%    \option{nographics} version. The \option{graphics} option turns graphics on again. You may
%    want to mark up all colored pictures so that you can decide in the preamble,
%    whether they shall be printed or not.
%
% \begin{example}[.86\textwidth]^^A
% |%\newcommand*\colorgraphic{}                 % print them;|\\
% |\newcommand*\colorgraphic{\crop[nographics]} % don't!|\\
% |...|\\
% |{\colorgraphic|\\
% |\includegraphics{...}|\\
% |\caption{...}|\\
% |}|
% \end{example}
% \end{labeling}
%
%
%
% {\makeatletter
% \ifx\CROPSTYfound\active
% \begin{figure}
%   \begin{quote}
%     \begin{center}
%       \vspace{1.5cm}
%       \leavevmode
%       \hbox to9cm{\CROP@@ulc\hss\CROP@@info\hss\CROP@@urc}
%       \vspace{.5cm}
%       \caption{That's what you see on top of a 9~cm wide document page when
%           \option{cam} mode is requested: the marks, jobname, date, time, page number and
%           crop marks index.}
%       \label{fig:marks}
%    \end{center}
%   \end{quote}
% \end{figure}
% \fi}
%
%
% \subsection{Loading}
%
% Since all marks lie outside the logical page, the horizontal and vertical
% offset should be set properly. Otherwise the marks are likely to be cut
% off by the \DVI\ driver or the printer.
% Provided that you have declared the size of your printing paper, you can
% use the |center| option to center every logical page on the respective sheet.
% There's, however, no harm in centering an \A~page on
% \A~paper, in which case both offsets are set to 0\,pt (unless, of course,
% you have set $\hbox{\verb"\mag"}\ne1000$).
%
% ^^A\begin{figure}
% \qquad\hbox{
% \begin{minipage}[t]{.45\textwidth}
%\begin{verbatim}
%\documentclass[a5paper]{article}
%\usepackage[cam,a4,center]{crop}
%\begin{document}
%...
%\end{document}
%\end{verbatim}
% \end{minipage}
%
% \begin{minipage}[t]{.45\textwidth}
%\begin{verbatim}
%\documentclass[a5paper]{article}
%\usepackage[a4,center]{crop}
%\begin{document}
%...
%\crop  % or: \crop[cross], etc.
%...
%\end{document}
%\end{verbatim}
% \end{minipage}
% }\hspace*{-1cm}
% ^^A\caption{Loading the package. The marks can be activated in the preamble
% ^^A         and anywhere in the document.}
% ^^A\label{fig:loading}
% ^^A\end{figure}
% \bigskip^^A\FIXME
%
% \noindent
% You get corner markings at every page shipped out after a \option{cam},
% \option{cross}, or \option{frame} mode request until you turn them off by
% typing \DescribeMacro{\crop}|\crop[off]|, or the actual grouping level
% ends.
% ^^ASee figure \ref{fig:loading}.
% Typing |\crop| without argument is equivalent to typing
% |\crop[cam,noaxes]|.
% Axis marks appear only together with one of the modes as listed above.
% If you only want one cover page for trimming, make sure that a page is
% actually output in the scope of |\crop|, for example:
%
% \begin{example}
% |\newpage|\\
% |{\crop[cross,axes]\mbox{}\newpage}|\\
% {}
% \end{example}
%
%
%
%
%
% \subsection{Color support}
%
% The \CROP\ package always tries to load the \package{color} package.
% You can change the color of the physical page as usual by using the
% |\pagecolor| command in the preamble. But after that, within the |document|
% environment, |\pagecolor| is redefined to only color the logical
% page. The color of crop marks, axes marks and page info can independently
% be set via the \option{color} option. The options \option{invert} and
% \option{notext} override any color settings.
%
%
%
%
%
%
% \subsection{Custom document page size}
% \label{sec:custom-logical}
%
% The \CROP\ package respects any page layout that you specify by means of
% \LaTeX\ dimensions. The following example uses the |geometry| package,
% which I strongly recommend. Let's assume you want to print a
% \CD~booklet ($4\,^{23}\!/_{32} \times 4\,^3\!/_4$~inch) on \ISO\ paper:
%
% \begin{example}
% |\documentclass{article}|\\
% |\usepackage[dvips=false,pdftex=false,vtex=false]{geometry}|
% \end{example}
%
% \indent
% \begin{example}
% |\geometry{|\\
% |   paperwidth=4.71875in,|\\
% |   paperheight=4.75in,|\\
% |   margin=2em,|\\
% |   bottom=1.5em,|\\
% |   nohead|\\
% |}|
% \end{example}
%
% \indent
% \begin{example}
% |\usepackage[cam,a4,center,dvips]{crop}|\\
% \end{example}
%
% \indent
% \begin{example}
% |\begin{document}|\\
% |...|\\
% |\end{document}|
% \end{example}
%
% Note that the \CROP\ package should always be requested after setting
% up the `geometry'. See the \package{geometry} documentation for details.
% Always disable all of \package{geometry}'s driver options. While this isn't
% necessary in every case, it doesn't hurt and it makes your document more portable.
% You never know how the local |geometry.cfg| file on other workstations looks
% like!
%
%
%
%
%
% \subsection{Custom printing paper sheet size}
%
% If you want to use one of the \option{center}, \option{dvips}, \option{pdftex},
% \option{pdflatex}, \option{luatex}, \option{lualatex} or \option{vtex}
% options together with non-standard printing paper, you can set it
% via the \option{width} and \option{height} option, or simply add
% the respective paper definition to your |crop.cfg| file (see \ref{sec:config}).
% Let's for example define a new \option{weird} paper format, whereby the first dimension
% shall describe the paper width. Don't forget to request |true| dimensions,
% otherwise you will get really weird results with scaled documents.
%
% \begin{example}
% |\DeclareOption{weird}{\CROP@size{12truecm}{34truecm}}|
% \end{example}
%
% Now you can use your new printing paper format like the pre-defined ones.
%
% \begin{example}
% |\usepackage[frame,weird,center]{crop}|\\
% \end{example}
%
% If you don't need that format regularly or don't want to depend on a
% |crop.cfg| file, then you might prefer to declare the dimensions in the document:
%
% \begin{example}
% |\usepackage[frame,width=12truecm,height=34truecm,center]{crop}|\hspace*{-3cm}\\
% \end{example}
% \null
%
%
%
%
%
% \subsection{Defining your own marks}
% \label{sec:cropdef}
%
% If you need a \option{funny} mode, you can easily define it with
% only a couple of macros. The \DescribeMacro{\cropdef}|\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.
%
% \begin{example}
% |\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}}|
% \end{example}
%
% \indent
% \begin{example}
% |\newcommand*\funnymarkB{%         % a bullet|\\
% |  \begin{picture}(0,0)|\\
% |    \unitlength1pt|\\
% |    \put(0,0){\circle*{5}}|\\
% |  \end{picture}}|\\
% \end{example}
%
% \indent
% \begin{example}[.91\textwidth]
% |\newcommand*\funnyinfo{funny page info}|\\
% |\cropdef[\funnyinfo]\relax\funnymarkA\relax\funnymarkB{funny}|
% \end{example}
%
%
% Now you can select your new mode by typing |\crop[funny]|.
%
% Each of the axis marks is a |picture| that you can easily replace
% by some custom definition. There's no setup command like |\cropdef|, though.
% The kernel provides two `hooks' that can be used to add local
% extensions. These are macros that default to |\relax|. The first, |\CROP@user@a|,
% is executed at every page, no matter if marks are shown or not, while the
% second, |\CROP@user@b| is only executed at pages that contain crop marks.
% Local definitions and modifications are ideally put into a local configuration
% file:
%
%
% \subsection{The configuration file}
% \label{sec:config}
%
% If you want to change the predefined settings or add new features,
% then create a file named `|crop.cfg|' and put it in a directory, where \TeX\
% can find it. This configuration file will then be loaded
% at the end of the |crop.sty| file, so you can redefine
% any settings or commands therein, select package options and even
% introduce new ones. But if you intend to give
% your documents to others, don't forget to give them the
% required configuration files, too! That's how such a file
% could look like:
%
% \begin{example}
% |% define a new printing paper size|\\
% |\DeclareOption{special}{\CROP@size{22truecm}{37truecm}}|
% \end{example}
%
% \indent
% \begin{example}
% |% make the internal time string (used in the page|\\
% |% information) accessible in the whole document|\\
% |\let\Time\CROP@time|
% \end{example}
%
% \indent
% \begin{example}
% |% let's use a different font for the predefined page|\\
% |% information (we could also have written|\\
% |% \newcommand*\CROP@font[1]{\textsf{#1}})|\\
% |\crop[font=textsf]|\\
% |\endinput|\\
% {}
% \end{example}
%
%
%
% \section{How the package works}
%
% \subsection{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 \package{everyshi} package
% by \person{Martin Schr\"oder,} from whom I have in fact borrowed some ideas).
%
% In addition to the crop marks every page gets an info line containing the
% jobname, the current date and time, the page number and an index number
% printed on top. This line can be turned off (\option{noinfo}) and on (\option{info})
% anywhere in the document.
%
%
%
%
% \subsection{Dependencies}
%
% \subsubsection{\package{latex.ltx}}
%
% The package works with all \LaTeXe\ standard classes (tested with
% \LaTeXe\ 1997/12/01 and sporadically with later versions), it does
% not work with plain \TeX.
%
% The \CROP\ package uses (and relies on) the internal \LaTeX\ tokens
% |\hb@xt@|, |\filename@parse|, |\@classoptionslist|,
% |\@ifundefined|, |\@height|, |\@depth|, |\filename@base|
% |\@width|, |\z@|, |\@ne|, |\z@skip|, |\p@|,
% |\c@page|, |\@namedef|, |\@nameuse|, |\strip@pt|, |\two@digits|,
% |\count@|, |\dimen@|, |\@for|, |\@empty|, |\@gobble| and |\@undefined|,
% % all of which are expected to keep their current meaning in future
% \LaTeXe\ releases. The \CROP\ package will, however, be supported
% at least for some years, so you needn't worry about it.
%
%
% \subsubsection{\package{color.sty}}
%
% \CROP's color handling depends on the \package{color} package.
% The following internal macros are used directly:
% |\@declaredcolor|, |\current@color|, |\set@color|, |\set@page@color|
% (Tested with |color.sty|, version~1.0i as of 1999/02/16.)
%
%
%
% \subsubsection{\package{graphics.sty}}
%
% \CROP's driver detection, as well as the options \option{rotate}
% \option{mirror}, and \option{nographics} depend on the
% \package{graphics} package. The following internal macros are used directly:
% |\Gin@PS@raw|, |\Ginclude@graphics|, |\Gin@driver|
% (Tested with |graphics.sty|, version~1.0l as of 1999/02/16.)
%
%
% \subsubsection{\package{ifluatex.sty}}
%
% \CROP's driver detection depends on the \package{ifluatex} package.
%
%
% \StopEventually{\addtocontents{toc}{\protect\end{multicols}}}
%
%
%
%
%
%
%
%
%^^A max 72 columns
%^^A--------------------------------------------------------------------
%
%
%
%
% \section{The implementation}
%
% \subsection{Preamble}
%
% \begin{macro}{\stockwidth}
% \begin{macro}{\stockheight}
% \begin{macro}{\CROP@index}
% \begin{macro}{\CROP@font}
% Make sure that |\stockwidth| and |\stockheight| are |\dimen|
% registers that hold the physical paper size. They are initially set
% to the paper size, but will be changed by the size options.
% These registers are also used\slash provided by the \package{memoir}
% class and the \package{hyperref} package.
% The |\CROP@font| macro is by default empty and can be changed
% through the \option{font} option.
%
%    \begin{macrocode}
%<*package>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{crop}[2017/11/19 1.10 crop marks (mf)]
\RequirePackage{ifluatex}
\expandafter\ifx\csname stockwidth\endcsname\relax
    \newdimen\stockwidth
    \stockwidth\paperwidth
\fi
\expandafter\ifx\csname stockheight\endcsname\relax
    \newdimen\stockheight
    \stockheight\paperheight
\fi
\newcount\CROP@index
\CROP@index\z@
\newcommand*\CROP@font{}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
%
%
%
%^^A--------------------------------------------------------------------
%
%
%
%
% \begin{macro}{\CROP@stockcolor}
% \begin{macro}{\CROP@pagecolor}
% \begin{macro}{\CROP@needscolor}
% Try to load the \package{color} package. It is needed for the
% \option{invert} and the \option{notext} option and, of course,
% for the modified |\pagecolor| command. Changing the meaning of
% |\current@color| looks dangerous, but it is only done if the
% \package{color} package couldn't be loaded, anyway.
%
%    \begin{macrocode}
\let\CROP@stockcolor\@empty
\let\CROP@pagecolor\@empty
\IfFileExists{color.sty}{%
    \RequirePackage{color}%
    \let\CROP@needscolor\@empty
}{%
    \newcommand*\CROP@needscolor{%
        \PackageError{crop}{%
            The `invert' and `notext' options require the\MessageBreak
            `color' package, which doesn't seem to be installed%
        }{%
            Install the `color' package or don't use the `invert'
            \MessageBreak or `notext' option.
        }%
        \let\CROP@needscolor\relax
    }%
    \let\current@color\relax
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
%
%
%
%^^A--------------------------------------------------------------------
%
%
%
%
% \subsection{The device drivers}
%
% \begin{macro}{\CROP@detdriver}
% \begin{macro}{\CROP@Ginclude@graphics}
% \begin{macro}{\CROP@ps}
% The options \option{graphics} and \option{nographics} depend on the
% \package{graphics} package, which, if configured appropriately, also
% tells us which output device is preferred on the system. Show a
% warning, if the package couldn't be loaded, because we have to use a
% less portable \PS\ `driver' then.
%
%    \begin{macrocode}
\let\CROP@detdriver\@empty
\IfFileExists{graphics.sty}{%
    \RequirePackage{graphics}%
    \let\CROP@Ginclude@graphics\Ginclude@graphics
    \ifx\Gin@driver\@empty\else
        \filename@parse{\Gin@driver}%
        \edef\CROP@detdriver{\filename@base}%
    \fi
    \let\CROP@ps\Gin@PS@raw
}{%
    \PackageWarning{crop}{I couldn't find the `graphics' package, so
        I'll use\MessageBreak my internal PostScript interface%
    }%
    \newcommand*\CROP@ps[1]{\special{ps: ##1}}%
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
%
%
%
%^^A--------------------------------------------------------------------
%
%
%
%
% \begin{macro}{\CROP@reqdriver}
% Define options that suggest \dots
%
%    \begin{macrocode}
\let\CROP@reqdriver\@empty
\DeclareOption{vtex}{\def\CROP@reqdriver{vtex}}
\DeclareOption{pdftex}{\def\CROP@reqdriver{pdftex}}
\DeclareOption{pdflatex}{\def\CROP@reqdriver{pdftex}}
\DeclareOption{luatex}{\def\CROP@reqdriver{luatex}}
\DeclareOption{lualatex}{\def\CROP@reqdriver{luatex}}
\DeclareOption{dvips}{\def\CROP@reqdriver{dvips}}
%    \end{macrocode}
% \end{macro}
%
%
%
%
%^^A--------------------------------------------------------------------
%
%
%
%
% \begin{macro}{\CROP@driver}
% \dots\ or enforce a graphics driver. Note the exclamation points!
%
%    \begin{macrocode}
\let\CROP@driver\@empty
\DeclareOption{vtex!}{\def\CROP@driver{vtex}}
\DeclareOption{pdftex!}{\def\CROP@driver{pdftex}}
\DeclareOption{pdflatex!}{\def\CROP@driver{pdftex}}
\DeclareOption{luatex!}{\def\CROP@driver{luatex}}
\DeclareOption{lualatex!}{\def\CROP@driver{luatex}}
\DeclareOption{dvips!}{\def\CROP@driver{dvips}}
\DeclareOption{nodriver}{\def\CROP@driver{none}}
\DeclareOption{!}{\def\CROP@driver{none}}
%    \end{macrocode}
% \end{macro}
%
%
%
%
%^^A--------------------------------------------------------------------
%
%
%
%
% \begin{macro}{\CROP@evaldriver}
% If |\CROP@driver| wasn't already set, decide |\AtBeginDocument| which
% graphics driver to use. A detected driver takes precedence over a
% `suggested' one. Show a warning if the user's choice is ignored.
%
%    \begin{macrocode}
\newcommand*\CROP@evaldriver{%
    \ifx\CROP@driver\@empty
        \PackageInfo{crop}{requested driver: `\CROP@reqdriver'}%
        \ifluatex
            \def\CROP@detdriver{luatex}%
        \else
            \ifx\pdfoutput\@undefined\else
                \ifx\pdfoutput\relax\else
                    \ifcase\pdfoutput\else
                        \def\CROP@detdriver{pdftex}%
                    \fi
                \fi
            \fi
        \fi
        \ifx\VTeXversion\@undefined\else
            \ifx\VTeXversion\relax\else
                \def\CROP@detdriver{vtex}%
            \fi
        \fi
        \PackageInfo{crop}{detected driver: `\CROP@detdriver'}%
        \ifx\CROP@reqdriver\@empty\else
            \ifx\CROP@reqdriver\@empty\else
                \ifx\CROP@reqdriver\CROP@detdriver\else
                    \PackageWarningNoLine{crop}{%
                        You requested the `\CROP@reqdriver' driver
                        but I think that\MessageBreak the
                        `\CROP@detdriver' driver works better in the
                        current\MessageBreak context. You can force
                        me to respect your decision\MessageBreak
                        by adding an exclamation point as in
                        [\CROP@reqdriver!]%
                    }%
                \fi
            \fi
        \fi
        \ifx\CROP@detdriver\@empty
            \let\CROP@driver\CROP@reqdriver
        \else
            \let\CROP@driver\CROP@detdriver
        \fi
    \fi
    \let\CROP@evaldriver\relax
}
\AtBeginDocument{\CROP@evaldriver}
%    \end{macrocode}
% \end{macro}
%
%
%
%
%^^A--------------------------------------------------------------------
%
%
%
%
% \begin{macro}{\CROP@init@dvips}
% \begin{macro}{\CROP@init@pdftex}
% \begin{macro}{\CROP@init@luatex}
% \begin{macro}{\CROP@init@vtex}
% \begin{macro}{\CROP@init@none}
% These macros prepare the \CROP\ package for one of the supported
% graphics drivers. They don't do anything spectacular, they just
% select the proper \option{rotate} and \option{mirror} macro and
% hand the physical paper size over to the driver program.
%
%    \begin{macrocode}
\newcommand*\CROP@init@dvips{%
    \PackageInfo{crop}{using `dvips' graphics driver}%
    \AtBeginDvi{%
        \special{papersize=\the\stockwidth,\the\stockheight}%
    }%
}
\newcommand*\CROP@init@pdftex{%
    \PackageInfo{crop}{using `pdftex' graphics driver}%
    \let\CROP@reflect\CROP@genreflect
    \let\CROP@rotate\CROP@genrotate
    \newcommand*\CROP@shiphook{%
        \pdfpagewidth\stockwidth
        \pdfpageheight\stockheight
    }%
}
\newcommand*\CROP@init@luatex{%
    \PackageInfo{crop}{using `luatex' graphics driver}%
    \pagewidth\stockwidth
    \pageheight\stockheight
    \let\CROP@reflect\CROP@genreflect
    \let\CROP@rotate\CROP@genrotate
}
\newcommand*\CROP@init@vtex{%
    \PackageInfo{crop}{using `vtex' graphics driver}%
    \mediawidth\stockwidth
    \mediaheight\stockheight
    \let\CROP@reflect\CROP@genreflect
    \let\CROP@rotate\CROP@genrotate
}
\newcommand*\CROP@init@none{%
    \PackageInfo{crop}{not using any graphics driver}%
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
%
%
%
%^^A--------------------------------------------------------------------
%
%
%
%
% \subsection{Size options}
%
% \begin{macro}{\CROP@size}
% \begin{macro}{\CROP@opt@width}
% \begin{macro}{\CROP@opt@height}
% These options set different standard printing paper sizes, which
% are needed for centering and as a hint for the \program{dvips},
% \program{pdftex}, \program{luatex} or \program{vtex} program.
% Since the physical paper
% dimensions must not undergo a possible scaling, |true| dimensions
% are used. The \option{landscape} option exchanges the |\hoffset| and
% |\voffset| values.
%
%    \begin{macrocode}
\newcommand*\CROP@size[2]{\stockwidth#1 \stockheight#2 }
\DeclareOption{landscape}{%
    \def\CROP@size#1#2{\stockheight#1 \stockwidth#2 }%
}
\DeclareOption{a0}{\CROP@size{841truemm}{1189truemm}}
\DeclareOption{a1}{\CROP@size{594truemm}{841truemm}}
\DeclareOption{a2}{\CROP@size{420truemm}{594truemm}}
\DeclareOption{a3}{\CROP@size{297truemm}{420truemm}}
\DeclareOption{a4}{\CROP@size{210truemm}{297truemm}}
\DeclareOption{a5}{\CROP@size{148truemm}{210truemm}}
\DeclareOption{a6}{\CROP@size{105truemm}{148truemm}}
\DeclareOption{b0}{\CROP@size{1000truemm}{1414truemm}}
\DeclareOption{b1}{\CROP@size{707truemm}{1000truemm}}
\DeclareOption{b2}{\CROP@size{500truemm}{707truemm}}
\DeclareOption{b3}{\CROP@size{353truemm}{500truemm}}
\DeclareOption{b4}{\CROP@size{250truemm}{353truemm}}
\DeclareOption{b5}{\CROP@size{176truemm}{250truemm}}
\DeclareOption{b6}{\CROP@size{125truemm}{176truemm}}
\DeclareOption{letter}{\CROP@size{8.5truein}{11truein}}
\DeclareOption{legal}{\CROP@size{8.5truein}{14truein}}
\DeclareOption{executive}{\CROP@size{7.25truein}{10.5truein}}
\newcommand\CROP@opt@width{\stockwidth\CROP@@}
\newcommand\CROP@opt@height{\stockheight\CROP@@}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
%
%
%
%^^A--------------------------------------------------------------------
%
%
%
%
% \begin{macro}{\CROP@center}
% The \option{center} option sets |\voffset| and |\hoffset| so that the
% document pages are centered on the printing paper sheets.
%
%    \begin{macrocode}
\DeclareOption{center}{\AtBeginDocument{\CROP@center}}
\newcommand*\CROP@center{%
    \voffset\stockheight
    \advance\voffset-\paperheight
    \voffset.5\voffset
    \hoffset\stockwidth
    \advance\hoffset-\paperwidth
    \hoffset.5\hoffset
}
%    \end{macrocode}
% \end{macro}
%
%
%
%
%^^A--------------------------------------------------------------------
%
%
%
%
% \subsection{Runtime options handling}
%
% Pass every unknown option to the macro |\CROP@execopt|.
%
%    \begin{macrocode}
\DeclareOption*{\CROP@execopt\CurrentOption}
%    \end{macrocode}
%
%
%
%
%^^A--------------------------------------------------------------------
%
%
%
%
% \begin{macro}{\crop}
% The |\crop| macro allows options to be used both in the preamble and
% throughout the document. Every argument of the optional argument list
% is passed to the macro |\CROP@execopt|. The options \option{cam} and
% \option{noaxes} are selected by default.
%
%    \begin{macrocode}
\newcommand*\crop[1][cam,noaxes]{%
    \@for\CROP@@:=#1\do{\CROP@execopt\CROP@@}%
}
%    \end{macrocode}
% \end{macro}
%
%
%
%
%^^A--------------------------------------------------------------------
%
%
%
%
% \begin{macro}{\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@@|.
% 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 makes the design simpler
% and doesn't hurt.
%
%    \begin{macrocode}
\newcommand*\CROP@execopt[1]{%
    \def\CROP@##1=##2=##3\@nil{\def\CROP@{##1}\def\CROP@@{##2}}%
    \expandafter\CROP@#1==\@nil%
    \@ifundefined{CROP@opt@\CROP@}{%
        \PackageError{crop}{%
            Requested option `#1' not provided%
        }{%
            Note that the `*center' options are obsolete. You have to
            request\MessageBreak e.g. [a4,center] instead of
            [a4center].
        }%
    }{%
        \@nameuse{CROP@opt@\CROP@}%
    }%
}
%    \end{macrocode}
% \end{macro}
%
%
%
%
%^^A--------------------------------------------------------------------
%
%
%
%
% \begin{macro}{\cropdef}
% The |\cropdef| macro defines a mode switch (see section
% \ref{sec:cropdef}). It supports only corner marks and the page info,
% but not the axis marks, mainly for hysterical raisins.
%
%    \begin{macrocode}
\newcommand*\cropdef[6][\CROP@@info]{%
    \@namedef{CROP@opt@#6}{%
        \def\CROP@info{#1}%
        \let\CROP@ulc#2
        \let\CROP@urc#3
        \let\CROP@llc#4
        \let\CROP@lrc#5
        \let\CROP@@@marks\CROP@marks
    }%
}
%    \end{macrocode}
% \end{macro}
%
%
%
%
%^^A--------------------------------------------------------------------
%
%
%
%
% \subsection{Axes and page info}
%
% \begin{macro}{\CROP@@laxis}
% \begin{macro}{\CROP@@raxis}
% \begin{macro}{\CROP@@upaxis}
% \begin{macro}{\CROP@@loaxis}
% The standard definitions for the \option{axes} option.
%
%    \begin{macrocode}
\newcommand*\CROP@@laxis{%
    \begin{picture}(0,0)
        \unitlength\p@\thinlines
        \put(-2,0){\line(-1,0){11}}
    \end{picture}%
}
\newcommand*\CROP@@raxis{%
    \begin{picture}(0,0)
        \unitlength\p@\thinlines
        \put(2,0){\line(1,0){11}}
    \end{picture}%
}
\newcommand*\CROP@@upaxis{%
    \begin{picture}(0,0)
        \unitlength\p@\thinlines
        \put(0,2){\line(0,1){11}}
    \end{picture}%
}
\newcommand*\CROP@@loaxis{%
    \begin{picture}(0,0)
        \unitlength\p@\thinlines
        \put(0,-2){\line(0,-1){11}}
    \end{picture}%
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
%
%
%
%^^A--------------------------------------------------------------------
%
%
%
%
% \begin{macro}{\CROP@time}
% \begin{macro}{\CROP@@info}
% \begin{macro}{\CROP@opt@font}
% This macro prints the jobname, the current date and time, the page
% number and an index number at the top of the logical page.
%
%    \begin{macrocode}
\newcommand*\CROP@time{}
\bgroup
    \count@\time
    \divide\time60
    \count\@ne\time
    \multiply\time60
    \advance\count@-\time
    \xdef\CROP@time{\the\count\@ne:\two@digits{\count@}}
\egroup
\newcommand*\CROP@@info{{%
    \global\advance\CROP@index\@ne
    \def\x{\discretionary{}{}{\hbox{\kern.5em---\kern.5em}}}%
    \advance\paperwidth-20\p@
    \dimen@4pt
    \ifx\CROP@pagecolor\@empty
    \else
        \advance\dimen@\CROP@overlap
    \fi
    \hb@xt@\z@{%
        \hss
        \vbox to\z@{%
            \centering
            \hsize\paperwidth
            \vss
            \normalfont
            \normalsize
            \expandafter\csname\CROP@font\endcsname{%
                ``\jobname''\x
                \the\year/\the\month/\the\day\x
                \CROP@time\x
                page\kern.5em\thepage\x
                \#\the\CROP@index
                \strut
            }%
            \vskip\dimen@
        }%
        \hss
    }%
}}
\newcommand*\CROP@opt@font{\let\CROP@font\CROP@@}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
%
%
%
%^^A--------------------------------------------------------------------
%
%
%
%
% \subsection{The marks}
%
% The following four macros provide different marks for the
% \option{cam} mode. They do not touch the logical page and can, thus,
% be printed on every single sheet.
%
% \begin{macro}{\CROP@@ulc}
% The \option{cam} mode corner mark for the upper left corner.
%
%    \begin{macrocode}
\newcommand*\CROP@@ulc{%
    \begin{picture}(0,0)
        \unitlength\p@\thinlines
        \put(-30,0){\circle{10}}
        \put(-30,-5){\line(0,1){10}}
        \put(-35,0){\line(1,0){30}}
        \put(0,30){\circle{10}}
        \put(-5,30){\line(1,0){10}}
        \put(0,35){\line(0,-1){30}}
    \end{picture}%
}
%    \end{macrocode}
% \end{macro}
%
%
%
%
%^^A--------------------------------------------------------------------
%
%
%
%
% \begin{macro}{\CROP@@urc}
% The \option{cam} mode corner mark for the upper right corner.
%
%    \begin{macrocode}
\newcommand*\CROP@@urc{%
    \begin{picture}(0,0)
        \unitlength\p@\thinlines
        \put(30,0){\circle{10}}
        \put(30,-5){\line(0,1){10}}
        \put(35,0){\line(-1,0){30}}
        \put(0,30){\circle{10}}
        \put(-5,30){\line(1,0){10}}
        \put(0,35){\line(0,-1){30}}
    \end{picture}%
}
%    \end{macrocode}
% \end{macro}
%
%
%
%
%^^A--------------------------------------------------------------------
%
%
%
%
% \begin{macro}{\CROP@@llc}
% The \option{cam} mode corner mark for the lower left corner.
%
%    \begin{macrocode}
\newcommand*\CROP@@llc{%
    \begin{picture}(0,0)
        \unitlength\p@\thinlines
        \put(-30,0){\circle{10}}
        \put(-30,-5){\line(0,1){10}}
        \put(-35,0){\line(1,0){30}}
        \put(0,-30){\circle{10}}
        \put(-5,-30){\line(1,0){10}}
        \put(0,-35){\line(0,1){30}}
    \end{picture}%
}
%    \end{macrocode}
% \end{macro}
%
%
%
%
%^^A--------------------------------------------------------------------
%
%
%
%
% \begin{macro}{\CROP@@lrc}
% The \option{cam} mode corner mark for the lower right corner.
%
%    \begin{macrocode}
\newcommand*\CROP@@lrc{%
    \begin{picture}(0,0)
        \unitlength\p@\thinlines
        \put(30,0){\circle{10}}
        \put(30,-5){\line(0,1){10}}
        \put(35,0){\line(-1,0){30}}
        \put(0,-30){\circle{10}}
        \put(-5,-30){\line(1,0){10}}
        \put(0,-35){\line(0,1){30}}
    \end{picture}%
}
%    \end{macrocode}
% \end{macro}
%
%
%
%
%^^A--------------------------------------------------------------------
%
%
%
%
% \begin{macro}{\CROP@opt@cam}
% Define the \option{cam} mode switch with four different marks.
%
%    \begin{macrocode}
\cropdef\CROP@@ulc\CROP@@urc\CROP@@llc\CROP@@lrc{cam}
%    \end{macrocode}
% \end{macro}
%
%
%
%
%^^A--------------------------------------------------------------------
%
%
%
%
% \begin{macro}{\CROP@@cross}
% This macro provides a 4~cm wide cross.
%
%    \begin{macrocode}
\newcommand*\CROP@@cross{%
    \begin{picture}(0,0)
        \unitlength1cm\thinlines
        \put(-2,0){\line(1,0){4}}
        \put(0,-2){\line(0,1){4}}
    \end{picture}%
}
%    \end{macrocode}
% \end{macro}
%
%
%
%
%^^A--------------------------------------------------------------------
%
%
%
%
% \begin{macro}{\CROP@opt@cross}
% Define the \option{cross} mode switch with four times the same mark.
%
%    \begin{macrocode}
\cropdef\CROP@@cross\CROP@@cross\CROP@@cross\CROP@@cross{cross}
%    \end{macrocode}
% \end{macro}
%
%
%
%
%^^A--------------------------------------------------------------------
%
%
%
%
% \begin{macro}{\CROP@@frame}
% The \option{frame} mode draws a simple frame around the logical
% page. The frame mark is designed to be used in the upper left
% corner. Since graphics commands expect numbers without dimensions,
% |\paperwidth| and \hbox{-|height|} are transformed to numbers
% (representing printer's points). This is done by stripping off the
% unit~|pt|.
%
%    \begin{macrocode}
\newcommand*\CROP@@frame{%
    \begin{picture}(0,0)
        \unitlength\p@\thinlines
        \put(0,0){\line(1,0){\strip@pt\paperwidth}}
        \put(0,0){\line(0,-1){\strip@pt\paperheight}}
        \put(\strip@pt\paperwidth,0){\line(0,-1){\strip@pt\paperheight}}
        \put(0,-\strip@pt\paperheight){\line(1,0){\strip@pt\paperwidth}}
    \end{picture}%
}
%    \end{macrocode}
% \end{macro}
%
%
%
%
%^^A--------------------------------------------------------------------
%
%
%
%
% \begin{macro}{\CROP@opt@frame}
% Define the \option{frame} mode switch with only one mark. The other
% corners may |\relax|.
%
%    \begin{macrocode}
\cropdef\CROP@@frame\relax\relax\relax{frame}
%    \end{macrocode}
% \end{macro}
%
%
%
%
%^^A--------------------------------------------------------------------
%
%
%
%
% \subsection{The kernel}
%
% \begin{macro}{\CROP@shipout}
% \begin{macro}{\shipout}
% \begin{macro}{\CROP@ship}
% \begin{macro}{\CROP@shiplist}
% \begin{macro}{\CROP@@ship}
%
% These macros redefine the \TeX\ primitive |\shipout| to insert the
% contents of the macro |\CROP@shiplist| on top of the box which contains
% the page contents ready for output, after which the original
% |\shipout| command is executed.
%
%    \begin{macrocode}
\let\CROP@shipout\shipout
\renewcommand*\shipout{%
    \afterassignment\CROP@ship
    \setbox\@cclv=%
}
\newcommand*\CROP@ship{%
    \ifvoid\@cclv
        \expandafter\aftergroup
    \fi
    \CROP@@ship
}
\newcommand*\CROP@shiplist{%
    \lineskip\z@
    \lineskiplimit\z@
    \baselineskip\z@
    \CROP@kernel
    \box\@cclv
}
\newcommand*\CROP@@ship{%
    \csname CROP@shiphook\endcsname
    \CROP@shipout\vbox{\CROP@shiplist}%
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
%
%
%
%^^A--------------------------------------------------------------------
%
%
%
%
% \begin{macro}{\CROP@shipadd}
% This macro adds a page manipulation command to the \emph{shiplist},
% which gets every ready page as argument.
%
%    \begin{macrocode}
\newcommand*\CROP@shipadd[1]{%
    \bgroup
        \toks@\expandafter{\expandafter#1\expandafter{\CROP@shiplist}}%
        \xdef\CROP@shiplist{\the\toks@}%
    \egroup
}
%    \end{macrocode}
% \end{macro}
%
%
%
%
%^^A--------------------------------------------------------------------
%
%
%
%
% \begin{macro}{\CROP@kernel}
% \begin{macro}{\CROP@marks}
% \begin{macro}{\CROP@@@marks}
% \begin{macro}{\CROP@setmarkcolor}
% \begin{macro}{\CROP@user@a}
% \begin{macro}{\CROP@user@b}
% \begin{macro}{\CROP@opt@horigin}
% \begin{macro}{\CROP@opt@vorigin}
% |\CROP@kernel| essentially contains a |\vbox| with zero width and
% height. The |\CROP@hook| command---which normally equals
% |\relax|---allows to insert commands that modify the behavior of the
% selected mode (see the options \option{mount1} and \option{mount2}).
% |\CROP@user@a| and |\CROP@user@b| are user definable hooks.
%
%    \begin{macrocode}
\newcommand*\CROP@kernel{%
    \vbox to\z@{%
        \vskip\CROP@vorigin
        \hb@xt@\z@{%
            \hskip\CROP@horigin
            \vbox to\paperheight{%
                \let\protect\relax
                \hsize\paperwidth
                \CROP@hook
                \CROP@user@a
                \CROP@drawstockcolor
                \CROP@drawpagecolor
                \CROP@@@marks
            }%
            \hss
        }%
        \vss
    }%
}
\newcommand*\CROP@marks{%
    \CROP@setmarkcolor
    \CROP@user@b
    \CROP@ulc\null\hfill\CROP@@@info\CROP@upedge\hfill\null\CROP@urc
    \vfill
    \CROP@ledge\hfill\CROP@redge
    \vfill
    \CROP@llc\null\hfill\CROP@loedge\hfill\null\CROP@lrc
}
\let\CROP@@@marks\CROP@marks
\newcommand*\CROP@setmarkcolor{%
    \let\current@color\CROP@markcolor
    \set@color
}
\let\CROP@user@a\relax
\let\CROP@user@b\relax
\newcommand*\CROP@opt@horigin{\let\CROP@horigin\CROP@@}
\newcommand*\CROP@opt@vorigin{\let\CROP@vorigin\CROP@@}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
%
%
%
%^^A--------------------------------------------------------------------
%
%
%
%
% \begin{macro}{\CROP@opt@off}
% \begin{macro}{\CROP@opt@odd}
% \begin{macro}{\CROP@opt@even}
% These macros start and stop the output of crop marks.
%
%    \begin{macrocode}
\newcommand*\CROP@opt@off{%
    \let\CROP@@@marks\vfil
}
\newcommand*\CROP@opt@odd{%
    \def\CROP@@@marks{\ifodd\c@page\CROP@marks\else\vfil\fi}%
}
\newcommand*\CROP@opt@even{%
    \def\CROP@@@marks{\ifodd\c@page\vfil\else\CROP@marks\fi}%
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
%
%
%
%^^A--------------------------------------------------------------------
%
%
%
%
% \begin{macro}{\CROP@@@info}
% \begin{macro}{\CROP@opt@info}
% \begin{macro}{\CROP@opt@noinfo}
% \begin{macro}{\CROP@opt@axes}
% \begin{macro}{\CROP@opt@noaxes}
% Enable and disable the output of axis marks and page info.
%
%    \begin{macrocode}
\newcommand*\CROP@@@info{}
\newcommand*\CROP@opt@info{\def\CROP@@@info{\CROP@info}}
\newcommand*\CROP@opt@noinfo{\let\CROP@@@info\relax}
\newcommand*\CROP@opt@axes{%
    \let\CROP@ledge\CROP@@laxis
    \let\CROP@redge\CROP@@raxis
    \let\CROP@upedge\CROP@@upaxis
    \let\CROP@loedge\CROP@@loaxis
}
\newcommand*\CROP@opt@noaxes{%
    \let\CROP@ledge\relax
    \let\CROP@redge\relax
    \let\CROP@upedge\relax
    \let\CROP@loedge\relax
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
%
%
%
%^^A--------------------------------------------------------------------
%
%
%
%
% \subsection{Mounting}
%
% \begin{macro}{\CROP@opt@mount1}
% \begin{macro}{\CROP@opt@mount2}
% Since |\newcommand| doesn't allow macro names to contain non-letters,
% we need a construction with |\csname|, |\endcsname|, and
% |\expandafter|. |\@namedef| would have worked, too, but it would not
% have made a check for redefinitions.
%
%    \begin{macrocode}
\expandafter\newcommand\expandafter*\csname CROP@opt@mount1\endcsname{%
    \let\CROP@hook\relax
}
\newcount\CROP@offset
\expandafter\newcommand\expandafter*\csname CROP@opt@mount2\endcsname{%
    \CROP@offset=\ifx\CROP@@\@empty\z@\else\CROP@@\fi
    \def\CROP@hook{%
        \count@\c@page
        \advance\count@\CROP@offset
        \ifodd\count@
            \let\CROP@ulc\relax
            \let\CROP@llc\relax
            \let\CROP@ledge\relax
        \else
            \let\CROP@urc\relax
            \let\CROP@lrc\relax
            \let\CROP@redge\relax
        \fi
    }%
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
%
%
%
%^^A--------------------------------------------------------------------
%
%
%
%
% \subsection{Page manipulation}
%
% \begin{macro}{\CROP@reflect}
% \begin{macro}{\CROP@genreflect}
% \begin{macro}{\CROP@rotate}
% \begin{macro}{\CROP@genrotate}
% The \option{mirror} and \option{rotate} options add a macro to the
% \emph{shiplist,} which then gets every output page and embeds it in
% a \POSTSCRIPT\ environment (\option{dvips}) or lets the
% \package{graphics} package reflect or rotate it (\option{pdftex} or
% \option{luatex}).
% We could also use the generic operations |\CROP@genreflect| and
% |\CROP@genrotate| for the \option{dvips} mode. They would produce
% correct \PS\ documents, the intermediate \DVI\ document, however,
% would be unreadable.
%
%    \begin{macrocode}
\DeclareOption{mirror}{%
    \AtBeginDocument{\CROP@shipadd\CROP@reflect}
}
\newcommand*\CROP@reflect[1]{%
    \vbox to\z@{%
        \vskip\CROP@vorigin
        \hb@xt@\z@{%
            \hskip\CROP@horigin
            \CROP@ps{gsave currentpoint}%
            \kern\paperwidth
            \CROP@ps{currentpoint}%
            \hss
        }%
        \vss
    }%
    \CROP@ps{translate -1 1 scale neg exch neg exch translate}%
    \vbox{#1}%
    \CROP@ps{grestore}%
}
\newcommand*\CROP@genreflect[1]{%
    \leavevmode
    \dimen0\CROP@horigin
    \kern2\dimen0
    \reflectbox{%
        \hb@xt@\paperwidth{%
            \vbox to\paperheight{%
                #1%
                \vss
            }%
            \hss
        }%
    }%
}
\DeclareOption{rotate}{%
    \AtBeginDocument{\CROP@shipadd\CROP@rotate}
}
\newcommand*\CROP@rotate[1]{%
    \hb@xt@\z@{%
        \hskip\CROP@horigin
        \vbox to\z@{%
            \vskip\CROP@vorigin
            \CROP@ps{gsave currentpoint}%
            \kern\paperheight
            \hb@xt@\z@{%
                \kern\paperwidth
                \CROP@ps{currentpoint}%
                \hss
            }%
            \vss
        }%
        \hss
    }%
    \CROP@ps{translate 180 rotate neg exch neg exch translate}%
    \vbox{#1}%
    \CROP@ps{grestore}%
}
\newcommand*\CROP@genrotate[1]{%
    \dimen0\CROP@vorigin
    \kern2\dimen0
    \leavevmode
    \dimen0\CROP@horigin
    \kern2\dimen0
    \rotatebox{180}{%
        \hb@xt@\paperwidth{%
            \vbox to\paperheight{%
                #1%
                \vss
            }%
            \hss
        }%
    }%
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
%
%
%
%^^A--------------------------------------------------------------------
%
%
%
%
% \subsection{Color handling}
%
% \begin{macro}{\CROP@stockcolor}
% \begin{macro}{\CROP@pagecolor}
% \begin{macro}{\set@page@color}
% \begin{macro}{\CROP@needscolor}
% \begin{macro}{\CROP@defmarkcolor}
% \begin{macro}{\CROP@opt@color}
% \begin{macro}{\CROP@drawstockcolor}
% \begin{macro}{\CROP@drawpagecolor}
% \begin{macro}{\CROP@overlap}
% \begin{macro}{\CROP@opt@overlap}
% These macros care for the color of crop marks and of the logical and
% the physical page. The \option{overlap} value is the amount that
% the logical page is drawn over the page boundaries on each side.
% This is necessary to get good results on imprecise cutting machines.
%
%    \begin{macrocode}
\newcommand*\CROP@defmarkcolor[1]{{%
    \def\set@color{\global\let\CROP@markcolor\current@color}%
    \@declaredcolor{#1}%
}}
\ifx\CROP@needscolor\@empty
    \renewcommand*\set@page@color{%
        \global\let\CROP@stockcolor\current@color
    }%
    \AtBeginDocument{%
        \def\set@page@color{%
            \global\let\CROP@pagecolor\current@color
        }%
    }%
    \CROP@defmarkcolor{black}%
    \let\CROP@needscolor\relax
\fi
\newcommand*\CROP@opt@color{%
    \CROP@needscolor
    \expandafter\CROP@defmarkcolor\expandafter{\CROP@@}%
}
\newcommand*\CROP@drawstockcolor{%
    \ifx\CROP@stockcolor\@empty
    \else
        \rlap{%
            \smash{%
                \raise\voffset\hbox{%
                    \let\current@color\CROP@stockcolor
                    \set@color
                    \hskip-\hoffset
                    \vrule width\stockwidth height\z@ depth\stockheight
                }%
            }%
        }%
    \fi
}
\newcommand*\CROP@drawpagecolor{%
    \ifx\CROP@pagecolor\@empty
    \else
        \rlap{%
            \smash{%
                \dimen@\CROP@overlap
                \advance\paperwidth2\dimen@
                \advance\paperheight2\dimen@
                \raise\dimen@\hbox{%
                    \let\current@color\CROP@pagecolor
                    \set@color
                    \hskip-\dimen@
                    \vrule width\paperwidth height\z@ depth\paperheight
                }%
            }%
        }%
    \fi
}
\def\CROP@overlap{3truemm}
\newcommand*\CROP@opt@overlap{\let\CROP@overlap\CROP@@}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
%
%
%
%^^A--------------------------------------------------------------------
%
%
%
%
% \begin{macro}{\CROP@invert}
% The \option{invert} option simply switches to black background
% and white text, after which it disables all color
% switching commands. The \option{notext} option does the same
% with white text on white background. The |\@gobble| on the last
% line keeps \option{notext} from switching to white background
% and breaking a prior \option{invert}.
%
%    \begin{macrocode}
\newcommand*\CROP@invert[1]{%
    \CROP@needscolor
    \AtBeginDvi{%
        \pagecolor{#1}%
        \global\let\set@page@color\relax
        \global\let\CROP@setpagecolor\relax
    }%
    \color{white}%
    \DeclareRobustCommand*\color[2][]{}%
    \let\pagecolor\color
    \let\textcolor\color
    \let\CROP@invert\@gobble
}
\DeclareOption{invert}{%
    \CROP@invert{black}%
    \let\CROP@setmarkcolor\relax
}
\DeclareOption{notext}{%
    \CROP@invert{white}%
}
%    \end{macrocode}
% \end{macro}
%
%
%
%
%^^A--------------------------------------------------------------------
%
%
%
%
% \subsection{The graphics commands}
%
% \begin{macro}{\CROP@opt@nographics}
% \begin{macro}{\CROP@opt@graphics}
% The \option{nographics} option redefines the |\Ginclude@graphics|
% command from the \package{graphics} package, so that it outputs its
% argument as a phantom. This makes the image invisible but takes up
% the same amount of white space. The \option{graphics} option
% re-enables graphics.
%
%    \begin{macrocode}
\newcommand*\CROP@opt@nographics{%
    \def\Ginclude@graphics##1{%
        \phantom{%
            \CROP@Ginclude@graphics{##1}%
        }%
    }%
}%
\newcommand*\CROP@opt@graphics{%
    \let\Ginclude@graphics\CROP@Ginclude@graphics
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
%
%
%
%^^A--------------------------------------------------------------------
%
%
%
%
% \subsection{Final settings}
%
% \begin{macro}{\CROP@horigin}
% \begin{macro}{\CROP@vorigin}
% 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 \option{off}, \option{noaxes}, \option{info}, and
% \option{mount1}, because it does not accept default options declared
% with |\DeclareOption*|. |\@nameuse| doesn't complain if the command
% sequence is undefined. We let this only be executed |\AtBeginDocument|,
% because there are possibly commands from the \option{center} option
% in the queue that have to be processed first.
%
%    \begin{macrocode}
\newcommand*\CROP@horigin{-1truein}
\newcommand*\CROP@vorigin{-1truein}
\crop[cam,off,noaxes,info,mount1]
\InputIfFileExists{crop.cfg}{%
    \PackageInfo{crop}{Local config file crop.cfg used}
}{}
\ProcessOptions
\AtBeginDocument{\@nameuse{CROP@init@\CROP@driver}}
\endinput
%</package>
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
%
%
%
%^^A--------------------------------------------------------------------
%
%
%
%
% \subsection{A \option{mount4} example}
% \label{sec:mount4}
%
% Since a \option{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 \ref{fig:mount4}.
%
% \begin{figure}
%   \begin{center}
%     \vspace*{10pt}
%     \makeatletter \catcode`\|=12
%     \sffamily\bfseries
%     \begin{tabular}{|c|c|}
%       \hline
%       \vrule\@height16\p@\@depth8\p@\@width\z@ 2&1\\
%       \hline
%       \vrule\@height16\p@\@depth8\p@\@width\z@ 0&3\\
%       \hline
%     \end{tabular}
%     \vspace*{-10pt}
%   \end{center}
%   \caption{Possible \option{mount4} arrangement}
%   \label{fig:mount4}
% \end{figure}
%
%
% First of all |\CROP@offset| is set to the value of the (optional)
% argument or zero.
% Then |\CROP@hook| is defined first to set |\count@| to the page number
% increased by this offset: $p=\mbox{pagenumber}+\mbox{offset}$.
% \medbreak
%
% {\def\MacroFont{\small\ttfamily\itshape}%
%\begin{verbatim}
%\expandafter\newcommand\expandafter*\csname CROP@opt@mount4\endcsname{%
%    \CROP@offset=\ifx\CROP@@\@empty\z@\else\CROP@@\fi
%    \def\CROP@hook{%
%        \count@\c@page
%        \advance\count@\CROP@offset
%\end{verbatim}
%
% \noindent
% 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
% `{\catcode`\|=12\texttt{||}}' the logical (inclusive) OR operator.
%
%\begin{verbatim}
%        \ifodd\count@                  %% if (p % 4 == 1 || p % 4 == 3)
%            \let\CROP@ulc\relax
%            \let\CROP@llc\relax
%            \let\CROP@ledge\relax
%            \divide\count@2
%            \ifodd\count@              %%    if (p % 4 == 3)
%                \let\CROP@urc\relax
%                \let\CROP@info\relax
%                \let\CROP@upedge\relax
%            \else                      %%    if (p % 4 == 1)
%                \let\CROP@lrc\relax
%                \let\CROP@loedge\relax
%            \fi
%        \else                          %% if (p % 4 == 0 || p % 4 == 2)
%            \let\CROP@urc\relax
%            \let\CROP@lrc\relax
%            \let\CROP@redge\relax
%            \divide\count@2
%            \ifodd\count@              %%    if (p % 4 == 2)
%                \let\CROP@llc\relax
%                \let\CROP@loedge\relax
%            \else                      %%    if (p % 4 == 0)
%                \let\CROP@ulc\relax
%                \let\CROP@info\relax
%                \let\CROP@upedge\relax
%            \fi
%        \fi
%    }%
%}
%\end{verbatim}
% }
%
% ^^A \PrintChanges
% ^^A vim:ts=4:sw=4:et:cindent
% \Finale                                               ^^A.E.I.O.U.^^