File: //usr/share/texlive/texmf-dist/tex/generic/context/mptopdf/mptopdf.tex
%D \module
%D [ file=mptopdf,
%D version=2011.05.19, % 2000.03.27,
%D title=\METAPOST,
%D subtitle=conversion to \PDF,
%D author=Hans Hagen,
%D date=\currentdate,
%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
%D The file \type {mptopdf} provides a quick way to convert
%D \METAPOST\ files to \PDF\ using a slightly stripped down
%D plain \TEX, \PDFTEX, and a few \CONTEXT\ modules.
%D
%D First generate a format, which in \WEBC\ looks like:
%D
%D \starttyping
%D pdftex --ini mptopdf
%D \stoptyping
%D
%D or:
%D
%D \starttyping
%D texexec --make --tex=pdftex --format=mptopdf --alone
%D \stoptyping
%D
%D Since this conversion only works with \PDFTEX\ or \PDFETEX,
%D the session is aborted when another \TEX\ is used. When
%D finished, the resulting \type {fmt} file should be moved to
%D the right location.
%D
%D The conversion itself is accomplished by:
%D
%D \starttyping
%D pdftex &mptopdf \relax filename.number
%D \stoptyping
%D
%D The \type {\relax} is needed since we don't want to process
%D the file directly. Instead we pick up the filename using
%D \type {\everypar}. Since this file is still the first one
%D we load, although delayed, the jobname is as we expect. So,
%D at least in \WEBC, the result of the conversion comes
%D available in the file \type {filename.pdf}. This conversion
%D process is roughly compatible with:
%D
%D \starttyping
%D texexec --pdf --fig=c --result=filename filename.number
%D \stoptyping
%D
%D This uses \CONTEXT, and is therefore slower. Therefore,
%D we provide a small \PERL\ script that does a faster job,
%D using the minimal format. Given that a format is
%D generated, one can say:
%D
%D \starttyping
%D mptopdf somefile
%D mptopdf somefile.123
%D mptopdf mp*.*
%D \stoptyping
%D
%D The results are copied into files named \type
%D {somefile-number}. This mechanism will also be available
%D in a next release of \TEXUTIL.
%D The \TEX\ implementation is rather simple, since we use some
%D generic \CONTEXT\ modules. Because we need a few register
%D allocation macros, we preload plain \TEX. We don't load
%D fonts yet.
\input syst-tex.mkii
%D We check for the usage of \PDFTEX, and quit if another
%D \TEX\ is used.
\ifx\pdfoutput\undefined
\message{Sorry, you should use pdf(e)TeX instead.}
\expandafter \endinput
\fi
%D The conversion to \PDF\ is carried out by macros, that
%D are collected in the file:
\input supp-mis.mkii
\input supp-pdf.mkii
\input supp-mpe.mkii \MPcmykcolorstrue \MPspotcolorstrue
%D We use no output routine.
\output{}
%D Since we need to calculate and set the bounding box,
%D we definitely don't want to indent paragraphs.
\parindent=0pt
%D We use \type {\everypar} to pick up the filename and
%D process the \METAPOST\ graphic.
\everypar{\processMPfile}
%D The main macro shows a few \PDFTEX\ primitives. The main
%D work is done by the macro \type {\convertMPtoPDF} which is
%D defined in \type supp-pdf}. This macro interprets the
%D \METAPOST\ file. Close reading of this macro will probably
%D learn a few (\PDF) tricks. Apart from some path
%D transformations, which are needed since \PDF\ has a
%D different vision on paths, the graphic is positioned in
%D such a way that accuracy in \PDF\ xforms is guaranteed.
\ifx\makeMPintoPDFobject\undefined \newcount\makeMPintoPDFobject \fi
\def\processMPfile#1 %
{\pdfoutput=1
\pdfpkresolution600
\pdfcompresslevel=9
\makeMPintoPDFobject=1
\hsize=100in
\vsize=\hsize
\hoffset=-1in
\voffset=\hoffset
\topskip=0pt
\setbox0=\vbox{\convertMPtoPDF{#1}{1}{1}}%
\ifdim\wd0<1in \message{[warning: the width is less than 1in]}\fi
\ifdim\ht0<1in \message{[warning: the height is less than 1in]}\fi
\pdfpageheight=\ht0
\pdfpagewidth=\wd0
\box0
\bye}
%D The \type {\chardef} forces the converter to build a so
%D called xform object. This is needed in case the graphic
%D uses special trickery, like shading.
%D Since \ACROBAT\ has troubles with figures smaller than
%D 1~inch, we issue a warning. When embedding graphics in
%D documents, a size less that 1~inch does not harm. In
%D order to overload runtime directives in the \PDFTEX\
%D configuration file, we set the offsets and output method
%D in the macro.
%D
%D The resulting \PDF\ file is about as efficient as such a
%D self contained file can be. However, if needed, this \PDF\
%D file can be converted to \EPS\ using for instance the
%D \PDFTOPS\ program (in \WEBC) or \GHOSTSCRIPT.
%D A few helpers:
{\catcode`\.=12
\catcode`\p=12
\catcode`\t=12
\gdef\WITHOUTPT#1pt{#1}}
\def\withoutpt#1%
{\expandafter\WITHOUTPT#1}
\def\negatecolorcomponent#1% #1 = \macro
{\scratchdimen1pt\advance\scratchdimen-#1\onepoint
\ifdim\scratchdimen<\zeropoint\scratchdimen\zeropoint\fi
\edef#1{\withoutpt\the\scratchdimen}}
\let\negatedcolorcomponent\firstofoneargument
\def\negatedcolorcomponent#1%
{\ifdim\dimexpr1pt-#1pt\relax<\zeropoint
0pt%
\else
\expandafter\withoutpt\the\dimexpr1pt-#1pt\relax
\fi}
\def\negatecolorcomponent#1% #1 = \macro
{\edef#1{\negatedcolorcomponent{#1}}}
\countdef\realpageno=0 % to satisfy mkiv status reports
\dump