ntg-context - mailing list for ConTeXt users
 help / color / mirror / Atom feed
From: "Keith J. Schultz" <keithjschultz@web.de>
To: mailing list for ConTeXt users <ntg-context@ntg.nl>
Subject: Re: MPLibrabray "txt" broken!?
Date: Wed, 15 May 2013 12:15:56 +0200	[thread overview]
Message-ID: <E8E3EA93-6F24-4329-B962-B7B365314FAF@web.de> (raw)
In-Reply-To: <98E44392-CC37-4045-B06E-649C5E09FA13@web.de>


[-- Attachment #1.1: Type: text/plain, Size: 1721 bytes --]

Hi Hans, Everybody,

Am 15.05.2013 um 09:36 schrieb "Keith J. Schultz" <keithjschultz@web.de>:

> Hi Hans,
> 
> Am 14.05.2013 um 19:57 schrieb Hans Hagen <pragma@wxs.nl>:
> 
>> 
[snip, snip]
>> some kind of initialization issue .. i uploaded a fix (crossed fingers)
> 
> 	Well, the fix work in a way , yet it has introduced a new problem,
> 	or revealed an unnoticed one.
> 	
> 	The text is now display in the shape, yet there is no drawing preformed!
> 	The draw of the path is no preformed.
> 	It is even worst. Metapost seems to be doing no drawing at all, even in over
> 	overlays! The all are related to a similar error :
> metapost        > initializing number mode 'scaled'
> metapost        > output file 'mpout.log', mode 'w', ftype 'log'
> metapost        > output file 'test2-mpgraph.mpd', mode 'w', ftype 0
> metapost        > output file 'test2-mpgraph.mpd', mode 'w', ftype 0
> metapost        > error: (/Users/quayjay/context/tex/texmf-context/metapost/context/base/mp-text.mpiv)
> 
> 
> 
> >> PageFraction
> >> false
> ! Equation cannot be performed (numeric=boolean).
> <to be read again> 
>                    :
> <*> ...0pt; VSize:=597.51323pt; PageFraction:=0>1:
>                                                   (1-1)/(0-1)else:1fi; defau...

I believe the source of this is in meta-ini.mkiv:
\startMPinitializations
    PageFraction:=\lastpage>1:(\realfolio-1)/(\lastpage-1)else:1fi;
\stopMPinitializations

Should this not be:
\startMPinitializations
    PageFraction:=if \lastpage>1:(\realfolio-1)/(\lastpage-1)else:1fi;
\stopMPinitializations

O.K. just rebuilt formats!

Works.

Attaching new meta-ini.mkiv

Thanx!

reagrds
	Keith.




[-- Attachment #1.2.1: Type: text/html, Size: 5287 bytes --]

[-- Attachment #1.2.2: meta-ini.mkiv --]
[-- Type: application/octet-stream, Size: 45126 bytes --]

%D \module
%D   [       file=meta-ini,
%D        version=2008.03.25,
%D          title=\METAPOST\ Graphics,
%D       subtitle=Initialization,
%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.

% initializations:
%
% - pass settings from tex to mp (delayed expansion)
% - used by context core (and modules)
% - cummulative definitions
% - flushed each graphic
% - can be disabled per instance
% - managed at the tex end
%
% extensions:
%
% - add mp functionality (immediate expansion)
% - cummulative
% - all instances or subset of instances
% - can be disabled per instance
% - managed at the lua/mp end
% - could be managed at the tex end but no real reason and also messy
%
% definitions:
%
% - add mp functionality (delayed expansion)
% - cummulative
% - per instance
% - managed at the tex end
%
% inclusions:
%
% - add mp functionality (delayed expansion)
% - cummulative only when [+]
% - per instance
% - managed at the tex end
%
% order of execution:
%
%   definitions
%   extensions
%   inclusions
%   beginfig
%     initializations
%     graphic
%   endfig

% The instance will be implemented stepwise ... I should redo some code in order to
% make the macros look better than they do now.

\writestatus{loading}{MetaPost Graphics / Initializations}

\registerctxluafile{meta-ini}{1.001}

\unprotect

\newtoks \everyMPgraphic          % mp % public or not ?

\appendtoks
    \restoreendofline % see interferences-001.tex
\to \everyMPgraphic

\def\MPruntimefile    {mprun}
\def\currentMPformat  {metafun}
\def\defaultMPinstance{metafun}

%installcorenamespace{graphicvariable} % todo
\installcorenamespace{mpinstance}
\installcorenamespace{mpinclusions}
\installcorenamespace{mpdefinitions}
\installcorenamespace{mpgraphic}
\installcorenamespace{mpstaticgraphic}
\installcorenamespace{mpclip}

\newtoks \t_meta_initializations  % tex, each
\def     \t_meta_inclusions     {\csname\??mpinclusions \currentMPinstance\endcsname} % token register
\def     \t_meta_definitions    {\csname\??mpdefinitions\currentMPinstance\endcsname} % token register

% The next command is, of course, dedicated to Mojca, who
% needs it for gnuplot. Anyway, the whole multiple engine
% mechanism is to keep her gnuplot from interfering.

\unexpanded\def\startMPdefinitions
  {\dosinglegroupempty\meta_start_definitions}

\def\meta_start_definitions#1#2\stopMPdefinitions
  {\let\m_meta_saved_instance\currentMPinstance
   \edef\currentMPinstance{#1}%
   \ifx\currentMPinstance\empty
     \let\currentMPinstance\defaultMPinstance
   \fi
   \global\t_meta_definitions\expandafter{\the\t_meta_definitions#2}%
   \let\currentMPinstance\m_meta_saved_instance}

\let\stopMPdefinitions\relax

\unexpanded\def\startMPextensions
  {\dosinglegroupempty\meta_start_extensions}

\def\meta_start_extensions#1#2\stopMPextensions % we could use buffers instead
  {\ctxlua{metapost.setextensions("#1",\!!bs#2\!!es)}}

\let\stopMPextensions\relax

\unexpanded\def\startMPinitializations#1\stopMPinitializations % for all instances, when enabled
  {\global\t_meta_initializations\expandafter{\the\t_meta_initializations#1}}

\let\stopMPinitializations\relax

\unexpanded\def\startMPinclusions
  {\dosingleempty\meta_start_inclusions}

\unexpanded\def\meta_start_inclusions[#1]%
  {\edef\m_meta_option{#1}%
   \dosinglegroupempty\meta_start_inclusions_indeed}

\def\meta_start_inclusions_indeed#1#2\stopMPinclusions
  {\let\m_meta_saved_instance\currentMPinstance
   \edef\currentMPinstance{#1}%
   \ifx\currentMPinstance\empty
     \let\currentMPinstance\defaultMPinstance
   \fi
   \ifx\m_meta_option\!!plustoken \else
     \global\t_meta_inclusions\emptytoks
   \fi
   \global\t_meta_inclusions\expandafter{\the\t_meta_inclusions#2}%
   \let\currentMPinstance\m_meta_saved_instance}

\let\stopMPinclusions\relax

\unexpanded\def\MPinclusions
  {\dosingleempty\meta_inclusions}

\def\meta_inclusions[#1]%
  {\edef\m_meta_option{#1}%
   \dosinglegroupempty\meta_inclusions_indeed}

\def\meta_inclusions_indeed#1#2%
  {\let\m_meta_saved_instance\currentMPinstance
   \edef\currentMPinstance{#1}%
   \ifx\currentMPinstance\empty
     \let\currentMPinstance\defaultMPinstance
   \fi
   \ifx\m_meta_option\!!plustoken \else
     \global\t_meta_inclusions\emptytoks
   \fi
   \global\t_meta_inclusions\expandafter{\the\t_meta_inclusions#2}%
   \let\currentMPinstance\m_meta_saved_instance}

\def\meta_preset_definitions
  {\edef\overlaywidth    {\overlaywidth    \space}%
   \edef\overlayheight   {\overlayheight   \space}%
   \edef\overlaylinewidth{\overlaylinewidth\space}%
   \edef\currentwidth    {\the\hsize       \space}%
   \edef\currentheight   {\the\vsize       \space}}

\installcommandhandler \??mpinstance {MPinstance} \??mpinstance

\setupMPinstance
  [\s!format=metafun,
   \s!extensions=\v!no,
   \s!initializations=\v!no,
   \c!method=\s!default,
   \c!textstyle=,
   \c!textcolor=]

\appendtoks
    \ifcsname\??mpdefinitions\currentMPinstance\endcsname \else
        \expandafter\newtoks\csname\??mpdefinitions\currentMPinstance\endcsname
    \fi
    \ifcsname\??mpinclusions\currentMPinstance\endcsname \else
        \expandafter\newtoks\csname\??mpinclusions\currentMPinstance\endcsname
    \fi
    \t_meta_definitions\emptytoks % in case we redefine
    \t_meta_inclusions \emptytoks % in case we redefine
\to \everydefineMPinstance

\unexpanded\def\resetMPinstance[#1]%
  {\writestatus\m!metapost{reset will be implemented when needed}}

\def\meta_analyze_graphicname[#1]%
 %{\normalexpanded{\meta_analyze_graphicname_indeed[#1::::]}}
  {\normalexpanded{\meta_analyze_graphicname_indeed[#1}::::]}

\unexpanded\def\meta_analyze_graphicname_indeed[#1::#2::#3]% instance ::
  {\edef\currentMPgraphicname{#2}%
   \ifx\currentMPgraphicname\empty
     \edef\currentMPgraphicname{#1}%
     \let\currentMPinstance\defaultMPinstance
   \else\ifcsname\??mpdefinitions#1\endcsname
     \edef\currentMPinstance{#1}%
   \else
     \let\currentMPinstance\defaultMPinstance
   \fi\fi
   \edef\currentMPformat{\MPinstanceparameter\s!format}}

\def\currentMPinstance{\defaultMPinstance}
\def\currentMPformat  {\currentMPinstance}

\defineMPinstance[metafun]   [\s!format=metafun,\s!extensions=\v!yes,\s!initializations=\v!yes]
\defineMPinstance[extrafun]  [\s!format=metafun,\s!extensions=\v!yes,\s!initializations=\v!yes]
\defineMPinstance[doublefun] [\s!format=metafun,\s!extensions=\v!yes,\s!initializations=\v!yes,\c!method=\s!double]
\defineMPinstance[decimalfun][\s!format=metafun,\s!extensions=\v!yes,\s!initializations=\v!yes,\c!method=\s!decimal]
\defineMPinstance[mprun]     [\s!format=metafun,\s!extensions=\v!yes,\s!initializations=\v!yes]
\defineMPinstance[metapost]  [\s!format=mpost]
\defineMPinstance[nofun]     [\s!format=mpost]

\newconditional\c_meta_include_initializations

\def\meta_begin_graphic_group#1%
  {\begingroup
   \meta_analyze_graphicname[#1]}

\def\meta_end_graphic_group
  {\endgroup}

\def\MPaskedfigure{false}

\def\meta_flush_current_initializations
  {\ifconditional\c_meta_include_initializations
     \the\t_meta_initializations
   \fi
   \theMPrandomseed;}

\def\meta_flush_current_inclusions
  {\the\t_meta_inclusions}

\def\meta_flush_current_definitions
  {\the\t_meta_definitions}

\def\meta_start_current_graphic
  {\begingroup
   \meta_enable_include
   \the\everyMPgraphic
   \meta_preset_definitions
   \setMPrandomseed % this has to change
   \edef\p_initializations{\MPinstanceparameter\s!initializations}%
   \ifx\p_initializations\v!yes
     \settrue \c_meta_include_initializations
   \else
     \setfalse\c_meta_include_initializations
   \fi
   \edef\p_setups{\MPinstanceparameter\c!setups}%
   \ifx\p_setups\empty \else
     \setups[\p_setups]%
   \fi
   \useMPinstancestyleandcolor\c!textstyle\c!textcolor}

\def\meta_stop_current_graphic
  {\global\t_meta_definitions\emptytoks
   \global\t_meta_inclusions\emptytoks
   \endgroup}

\def\meta_process_graphic_start
  {\setbox\b_meta_graphic\hbox\bgroup}

\def\meta_process_graphic_stop
  {\egroup
   \meta_place_graphic}

\unexpanded\def\meta_process_graphic_instance#1%
  {\edef\currentMPinstance{#1}%
   \ifx\currentMPinstance\empty
     \let\currentMPinstance\defaultMPinstance
   \fi
   \edef\currentMPformat{\MPinstanceparameter\s!format}%
   \meta_process_graphic}

\unexpanded\def\meta_process_graphic#1% todo: extensions and inclusions outside beginfig
  {\meta_start_current_graphic
   \forgetall
   \edef\p_extensions{\MPinstanceparameter\s!extensions}%
   \meta_process_graphic_start
     \normalexpanded{\noexpand\ctxlua{metapost.graphic {
       instance        = "\currentMPinstance",
       format          = "\currentMPformat",
       data            = \!!bs#1;\!!es,
       initializations = \!!bs\meta_flush_current_initializations\!!es,
%      useextensions   = "\MPinstanceparameter\s!extensions",
\ifx\p_extensions\v!yes
       extensions      = \!!bs\ctxcommand{getmpextensions("\currentMPinstance")}\!!es,
\fi
       inclusions      = \!!bs\meta_flush_current_inclusions\!!es,
       definitions     = \!!bs\meta_flush_current_definitions\!!es,
       figure          = "\MPaskedfigure",
       method          = "\MPinstanceparameter\c!method",
     }}}%
   \meta_process_graphic_stop
   \meta_stop_current_graphic}

\let\meta_process_graphic_figure_start\relax
\let\meta_process_graphic_figure_stop \relax

\unexpanded\def\processMPfigurefile#1% special case: obeys beginfig .. endfig and makes pages
  {\begingroup
   \let\normal_meta_process_graphic_start\meta_process_graphic_start
   \let\normal_meta_process_graphic_stop \meta_process_graphic_stop
   \let\meta_process_graphic_start\relax
   \let\meta_process_graphic_stop \relax
   \def\meta_process_graphic_figure_start{\startTEXpage\normal_meta_process_graphic_start}%
   \def\meta_process_graphic_figure_stop {\normal_meta_process_graphic_stop\stopTEXpage}
   \def\MPaskedfigure{all}%
   \meta_process_graphic{input "#1" ;}%
   \endgroup}

\newif\ifsetMPrandomseed \setMPrandomseedtrue % false by default

\def\setMPrandomseed
  {\let\theMPrandomseed\empty
   \ifsetMPrandomseed \ifx\getrandomnumber\undefined \else
     \getrandomnumber\localMPseed\zerocount{4095}%
     \def\theMPrandomseed{randomseed:=\localMPseed}%
   \fi\fi}

%D Calling up previously defined graphics.

\def\includeMPgraphic#1% gets expanded !
  {\ifcsname\??mpgraphic#1\endcsname
     \csname\??mpgraphic#1\endcsname ; % ; is safeguard
   \fi}

\unexpanded\def\meta_enable_include % public
  {\let\meta_handle_use_graphic     \thirdofthreearguments
   \let\meta_handle_reusable_graphic\thirdofthreearguments}

%D Drawings (stepwise built):

\newif\ifMPdrawingdone \MPdrawingdonefalse

\unexpanded\def\finalizeMPdrawing
  {\MPdrawingdonetrue}

\let\MPdrawingdata\empty

\unexpanded\def\resetMPdrawing
  {\global\let\MPdrawingdata\empty
   \global\MPdrawingdonefalse}

\unexpanded\def\pushMPdrawing
  {\globalpushmacro\MPdrawingdata
   \global\let\MPdrawingdata\empty}

\unexpanded\def\popMPdrawing
  {\globalpopmacro\MPdrawingdata}

\unexpanded\def\getMPdrawing
  {\ifMPdrawingdone
     \expandafter\meta_process_graphic\expandafter{\MPdrawingdata}% is this expansion still needed?
   \fi}

\def\startMPdrawing
  {\dosingleempty\meta_start_drawing}

\def\meta_start_drawing[#1]#2\stopMPdrawing
  {\relax
   \bgroup
   \meta_enable_include
   \meta_preset_definitions % in case #2 has measures
   \doifelse{#1}{-}{\convertargument#2\to\asciia}{\def\asciia{#2}}%
   \xdef\MPdrawingdata{\MPdrawingdata\asciia}%
   \egroup}

\let\stopMPdrawing\relax

\def\MPdrawing#1%
  {\relax
   \bgroup
   \meta_enable_include
   \meta_preset_definitions
   \xdef\MPdrawingdata{\MPdrawingdata#1}%
   \egroup}

\unexpanded\def\startMPclip#1#2\stopMPclip % todo: store at the lua end or just store less
  {\setgvalue{\??mpclip#1}{#2}}

\let\stopMPclip\relax

\unexpanded\def\meta_grab_clip_path#1#2#3#4% #4 is alternative (called in backend code)
  {\begingroup
   \edef\width {#2\space}\let\overlaywidth \width
   \edef\height{#3\space}\let\overlayheight\height
   \ifcsname\??mpclip#1\endcsname
     \meta_start_current_graphic
       \xdef\MPclippath{\normalexpanded{\noexpand\ctxlua{metapost.theclippath {
            instance        = "\currentMPinstance",
            format          = "\currentMPformat",
            data            = \!!bs\getvalue{\??mpclip#1}\!!es,
            initializations = \!!bs\meta_flush_current_initializations\!!es,
            useextensions   = "\MPinstanceparameter\s!extensions",
            inclusions      = \!!bs\meta_flush_current_inclusions\!!es,
            method          = "\MPinstanceparameter\c!method",
       }}}}%
     \meta_stop_current_graphic
     \ifx\MPclippath\empty
       \xdef\MPclippath{#4}%
     \fi
   \else
     \xdef\MPclippath{#4}%
   \fi
   \endgroup}

%D Since we want lables to follow the document settings, we
%D also set the font related variables.

\unexpanded\def\MPfontsizehskip#1%
  {\dontleavehmode
   \begingroup
   \definedfont[#1]%
   \hskip\cldcontext{fonts.hashes.parameters[font.current()].designsize}sp\relax
   \endgroup}

\startMPinitializations % scale is not yet ok
    defaultfont:="\truefontname{Regular}";
    defaultscale:=\the\bodyfontsize/10pt;
\stopMPinitializations

% watch out, this is a type1 font because mp can only handle 8 bit fonts

\startMPinitializations % scale is not yet ok
    defaultfont:="rm-lmtt10";
\stopMPinitializations

%D A signal that we're in combined \CONTEXT||\METAFUN mode:

\startMPextensions
    string contextversion;
    contextversion:="\contextversion"; % expanded
\stopMPextensions

%D \macros
%D   {setupMPvariables}
%D
%D When we build collections of \METAPOST\ graphics, like
%D background and buttons, the need for passing settings
%D arises. By (mis|)|using the local prefix that belongs to
%D \type {\framed}, we get a rather natural interface to
%D backgrounds. To prevent conflicts, we will use the \type
%D {-} in \METAPOST\ specific variables, like:
%D
%D \starttyping
%D \setupMPvariables[meta:button][size=20pt]
%D \stoptyping

% \lineheight  2pt  2  \scratchcounter  red  0.4  .5\bodyfontsize
%
% see cont-loc for test code
%
% currently the inheritance of backgrounds does not work and
% we might drop it anyway (too messy)

\newbox\b_meta_variable_box

\let \currentmpvariableclass          \empty
\let \m_meta_current_variable         \empty
\let \m_meta_current_variable_template\empty

\installcorenamespace{graphicvariable}

\def \meta_prepare_variable_default   {\MPcolor{black}} % just to be sure we use a color but ...
\edef\meta_unknown_variable_template  {\??graphicvariable:\s!unknown}

\letvalue{\??graphicvariable:\s!unknown}\empty

\unexpanded\def\setupMPvariables
  {\dodoubleempty\meta_setup_variables}

\def\meta_setup_variables[#1][#2]%
  {\ifsecondargument
     \getrawparameters[\??graphicvariable#1:][#2]%
   \else
     \getrawparameters[\??graphicvariable:][#1]%
   \fi}

\unexpanded\def\presetMPvariable
  {\dodoubleargument\meta_preset_variable}

\def\meta_preset_variable[#1][#2=#3]%
  {\ifcsname\??graphicvariable#1:#2\endcsname \else
     \setvalue{\??graphicvariable#1:#2}{#3}%
   \fi}

\def\MPrawvar#1#2% no checking
  {\csname\??graphicvariable#1:#2\endcsname}

\def\MPvariable#1% todo: could be a framed chain
  {\csname\??graphicvariable\currentmpvariableclass:#1\endcsname}

\unexpanded\def\useMPvariables
  {\dodoubleargument\meta_use_variables}

\def\meta_use_variables[#1][#2]%
  {\edef\currentmpvariableclass{#1}%
   \meta_prepare_variables{#2}}

\unexpanded\def\meta_prepare_variables#1%
  {\processcommalist[#1]\meta_prepare_variable}

\unexpanded\def\meta_prepare_variable#1%
  {\edef\m_meta_current_variable_template
     {\??graphicvariable\currentmpvariableclass:#1}%
   \edef\m_meta_current_variable
     {\csname\ifcsname\m_meta_current_variable_template\endcsname
        \m_meta_current_variable_template\else\meta_unknown_variable_template
      \fi\endcsname}%
   \ifx\m_meta_current_variable\empty
     \expandafter\meta_prepare_variable_nop
   \else
     \expandafter\meta_prepare_variable_yes
   \fi}

\unexpanded\def\meta_prepare_instance_variables
  {\expandafter\processcommalist\expandafter[\m_meta_instance_variables]\meta_prepare_instance_variable}

\unexpanded\def\meta_prepare_instance_variable#1%
  {\edef\m_meta_current_variable_template
     {\??graphicvariable\currentmpvariableclass:#1}%
   \edef\m_meta_current_variable
     {\csname
        \ifcsname\m_meta_current_variable_template\endcsname
          \m_meta_current_variable_template
        \else\ifcsname\??graphicvariable\currentMPgraphicname:#1\endcsname
          \??graphicvariable\currentMPgraphicname:#1%
        \else
          \meta_unknown_variable_template
        \fi\fi
      \endcsname}%
   \ifx\m_meta_current_variable\empty
     \expandafter\meta_prepare_variable_nop
   \else
     \expandafter\meta_prepare_variable_yes
   \fi}

\def\meta_prepare_variable_nop
  {\expandafter \let\csname\m_meta_current_variable_template\endcsname\meta_prepare_variable_default}

\def\meta_prepare_variable_color
  {\expandafter\edef\csname\m_meta_current_variable_template\endcsname{\MPcolor\m_meta_current_variable}}

\def\meta_prepare_variable_number
  {\expandafter\edef\csname\m_meta_current_variable_template\endcsname{\number\m_meta_current_variable}}% also accepts 0.number

\def\meta_prepare_variable_dimension
  {\expandafter\edef\csname\m_meta_current_variable_template\endcsname{\the\dimexpr\m_meta_current_variable}}

\def\meta_prepare_variable_yes
  {\defconvertedcommand\ascii\m_meta_current_variable % otherwise problems
   \doifcolorelse \ascii                              % with 2\bodyfontsize
     {\meta_prepare_variable_color}
     {\begingroup
      \setbox\b_meta_variable_box\hbox{\scratchdimen\m_meta_current_variable sp}%
      \ifzeropt\wd\b_meta_variable_box
        \endgroup\meta_prepare_variable_number
      \else
        \endgroup\meta_prepare_variable_dimension
      \fi}}

\let\MPvar         \MPvariable
\let\setMPvariables\setupMPvariables

%D \macros
%D   {startuniqueMPgraphic, uniqueMPgraphic}
%D
%D This macros is probably of most use to myself, since I like
%D to use graphics that adapt themselves. The next \METAPOST\
%D kind of graphic is both unique and reused when possible.
%D
%D \starttyping
%D \defineoverlay[example][\uniqueMPgraphic{test}]
%D
%D \startuniqueMPgraphic {test}
%D   draw unitsquare xscaled \overlaywidth yscaled \overlayheight ;
%D \stopuniqueMPgraphic
%D \stoptyping

\def\overlaystamp % watch the \MPcolor, since colors can be redefined
  {\overlaywidth:\overlayheight:\overlaydepth:\MPcolor\overlaycolor:\MPcolor\overlaylinecolor}

%D A better approach is to let additional variables play a role
%D in determining the uniqueness. In the next macro, the
%D second, optional, argument is used to guarantee the
%D uniqueness, as well as prepare variables for passing them to
%D \METAPOST.
%D
%D \starttyping
%D \startuniqueMPgraphic{meta:hash}{gap,angle,...}
%D \stoptyping
%D
%D The calling macro also accepts a second argument. For
%D convenient use in overlay definitions, we use \type {{}}
%D instead of \type {[]}.
%D
%D \starttyping
%D \uniqueMPgraphic{meta:hash}{gap=10pt,angle=30}
%D \stoptyping

\newcount\c_meta_object_counter
\newbox  \b_meta_graphic

% hm, isn't this already done elsewhere?

\unexpanded\def\meta_obey_box_depth
  {\setbox\b_meta_graphic\hbox\bgroup
     \raise\MPlly\box\b_meta_graphic
   \egroup}

\unexpanded\def\meta_ignore_box_depth
  {\normalexpanded
     {\meta_obey_box_depth % hence the \unexpanded
      \wd\b_meta_graphic\the\wd\b_meta_graphic
      \ht\b_meta_graphic\the\ht\b_meta_graphic
      \dp\b_meta_graphic\the\dp\b_meta_graphic}}

\unexpanded\def\meta_obey_box_origin
  {\setbox\b_meta_graphic\hbox\bgroup
     \kern\MPllx\raise\MPlly\box\b_meta_graphic
   \egroup}

\unexpanded\def\obeyMPboxdepth  {\let\meta_relocate_box\meta_obey_box_depth  }
\unexpanded\def\ignoreMPboxdepth{\let\meta_relocate_box\meta_ignore_box_depth}
\unexpanded\def\obeyMPboxorigin {\let\meta_relocate_box\meta_obey_box_origin }
\unexpanded\def\normalMPboxdepth{\let\meta_relocate_box\relax              }

\let\meta_relocate_box\relax

\unexpanded\def\meta_place_graphic % the converter also displaces so in fact we revert
  {\meta_relocate_box
   \box\b_meta_graphic}

\unexpanded\def\meta_reuse_box#1#2#3#4#5% space delimiting would save some tokens
  {\MPllx#2\MPlly#3\MPurx#4\MPury#5%
   \hbox{\forcecolorhack\getobject{MP}{#1}}} % else no proper color intent

\def\meta_handle_unique_graphic#1#2#3% when there are too many, we can store data at the lua end, although,
  {\begingroup                  % when there are that many they're probably not that unique anyway
   \edef\currentmpvariableclass{#1}%
   \extendMPoverlaystamp{#2}% incl prepare
   \ifcsname\??mpgraphic\overlaystamp:#1\endcsname\else
     \meta_enable_include % redundant
     \global\advance\c_meta_object_counter\plusone
     \setobject{MP}{\number\c_meta_object_counter}\hbox{\meta_process_graphic{#3}}% was vbox, graphic must end up as hbox
     \setxvalue{\??mpgraphic\overlaystamp:#1}{\meta_reuse_box{\number\c_meta_object_counter}{\the\MPllx}{\the\MPlly}{\the\MPurx}{\the\MPury}}%
   \fi
   \getvalue{\??mpgraphic\overlaystamp:#1}%
   \endgroup}

\unexpanded\def\startuniqueMPgraphic
  {\dodoublegroupempty\meta_start_unique_graphic}

% \def\meta_start_unique_graphic#1#2#3\stopuniqueMPgraphic
%   {\setgvalue{\??mpgraphic#1}{\meta_handle_unique_graphic{#1}{#2}{#3}}}

\def\meta_start_unique_graphic#1%
  {\normalexpanded{\meta_start_unique_graphic_indeed{#1}}}

\unexpanded\def\meta_start_unique_graphic_indeed#1#2#3\stopuniqueMPgraphic
  {\setgvalue{\??mpgraphic#1}{\meta_handle_unique_graphic{#1}{#2}{#3}}}

\let\stopuniqueMPgraphic\relax

\unexpanded\def\uniqueMPgraphic
  {\dodoublegroupempty\meta_unique_graphic}

\def\meta_unique_graphic#1#2%
  {\meta_begin_graphic_group{#1}%
%    \setupMPvariables[\currentMPgraphicname][#2]%
   \setupMPvariables[#1][#2]%
   \getvalue{\??mpgraphic#1}\empty
   \meta_end_graphic_group}

\def\meta_handle_use_graphic#1#2#3%
  {\begingroup
   \edef\currentmpvariableclass{#1}%
   \edef\m_meta_instance_variables{#2}%
   \ifx\m_meta_instance_variables\empty \else
     \meta_prepare_instance_variables
   \fi
   \meta_enable_include % redundant
   \meta_process_graphic{#3}%
   \endgroup}

\unexpanded\def\startuseMPgraphic
  {\dodoublegroupempty\meta_start_use_graphic}

% \def\meta_start_use_graphic#1#2#3\stopuseMPgraphic
%   {\setgvalue{\??mpgraphic#1}{\meta_handle_use_graphic{#1}{#2}{#3}}}
%
% better, expansion of #1:
%
% \def\meta_start_use_graphic#1#2#3\stopuseMPgraphic
%  %{\setgvalue{\??mpgraphic#1}{\meta_handle_use_graphic{#1}{#2}{#3}}}
%  %{\setxvalue{\??mpgraphic#1}{\noexpand\meta_handle_use_graphic{#1}{\normalunexpanded{#2}}{\normalunexpanded{#3}}}}
%   {\global\expandafter\gdef\csname\??mpgraphic#1\expandafter\endcsname\expandafter{\expandafter\meta_handle_use_graphic\expandafter{\normalexpanded{#1}}{#2}{#3}}}
%
% cleaner:

\def\meta_start_use_graphic#1%
  {\normalexpanded{\meta_start_use_graphic_indeed{#1}}}

\unexpanded\def\meta_start_use_graphic_indeed#1#2#3\stopuseMPgraphic
  {\setgvalue{\??mpgraphic#1}{\meta_handle_use_graphic{#1}{#2}{#3}}}

\let\stopuseMPgraphic\relax

\unexpanded\def\startusableMPgraphic % redundant but handy
  {\dodoublegroupempty\meta_start_usable_graphic}

% \def\meta_start_usable_graphic#1#2#3\stopusableMPgraphic
%   {\setgvalue{\??mpgraphic#1}{\meta_handle_use_graphic{#1}{#2}{#3}}}

\def\meta_start_usable_graphic#1%
  {\normalexpanded{\meta_start_usable_graphic_indeed{#1}}}

\unexpanded\def\meta_start_usable_graphic_indeed#1#2#3\stopusableMPgraphic
  {\setgvalue{\??mpgraphic#1}{\meta_handle_use_graphic{#1}{#2}{#3}}}

\let\stopusableMPgraphic\relax

\def\meta_handle_reusable_graphic#1#2#3%
  {\begingroup
   \edef\currentmpvariableclass{#1}%
   \edef\m_meta_instance_variables{#2}%
   \ifx\m_meta_instance_variables\empty \else
     \meta_prepare_instance_variables
   \fi
   \meta_enable_include % redundant
   \global\advance\c_meta_object_counter\plusone
   \setobject{MP}{\number\c_meta_object_counter}\hbox{\meta_process_graphic{#3}}% was vbox, graphic must end up as hbox
   \setxvalue{\??mpgraphic#1}{\meta_reuse_box{\number\c_meta_object_counter}{\the\MPllx}{\the\MPlly}{\the\MPurx}{\the\MPury}}%
   \getvalue{\??mpgraphic#1}%
   \endgroup}

\unexpanded\def\startreusableMPgraphic
  {\dodoublegroupempty\meta_start_reusable_graphic}

% \def\meta_start_reusable_graphic#1#2#3\stopreusableMPgraphic
%   {\setgvalue{\??mpgraphic#1}{\meta_handle_reusable_graphic{#1}{#2}{#3}}}

\def\meta_start_reusable_graphic#1%
  {\normalexpanded{\meta_start_reusable_graphic_indeed{#1}}}

\unexpanded\def\meta_start_reusable_graphic_indeed#1#2#3\stopreusableMPgraphic
  {\setgvalue{\??mpgraphic#1}{\meta_handle_reusable_graphic{#1}{#2}{#3}}}

\let\stopreusableMPgraphic\relax

\unexpanded\def\useMPgraphic
  {\dodoublegroupempty\meta_use_graphic}

\def\meta_use_graphic#1#2%
  {\meta_begin_graphic_group{#1}%
%    \doifsomething{#2}{\setupMPvariables[\currentMPgraphicname][#2]}%
   \doifsomething{#2}{\setupMPvariables[#1][#2]}%
   \getvalue{\??mpgraphic#1}\empty
   \meta_end_graphic_group}

\let\reuseMPgraphic   \useMPgraphic   % we can save a setup here if needed
\let\reusableMPgraphic\reuseMPgraphic % we can save a setup here if needed

\unexpanded\def\meta_enable_include
  {\let\meta_handle_use_graphic     \thirdofthreearguments
   \let\meta_handle_reusable_graphic\thirdofthreearguments}

%D \macros
%D   {startuniqueMPpagegraphic,uniqueMPpagegraphic}
%D
%D Experimental.

\def\m_meta_page_prefix{\doifoddpageelse oe}

\def\overlaypagestamp
  {\m_meta_page_prefix:\overlaywidth:\overlayheight:\overlaydepth:\MPcolor\overlaycolor:\MPcolor\overlaylinecolor}

\unexpanded\def\startuniqueMPpagegraphic
  {\dodoublegroupempty\meta_start_unique_page_graphic}

% \def\meta_start_unique_page_graphic#1#2#3\stopuniqueMPpagegraphic              % inefficient, double storage
%   {\setgvalue{\??mpgraphic o:#1}{\meta_handle_unique_graphic{o:#1}{#2}{#3}}%   % but these also keep the state
%    \setgvalue{\??mpgraphic e:#1}{\meta_handle_unique_graphic{e:#1}{#2}{#3}}}   % and meaning will be redefined

\def\meta_start_unique_page_graphic#1%
  {\normalexpanded{\meta_start_unique_page_graphic_indeed{#1}}}

\unexpanded\def\meta_start_unique_page_graphic_indeed#1#2#3\stopuniqueMPpagegraphic % inefficient, double storage
  {\setgvalue{\??mpgraphic o:#1}{\meta_handle_unique_graphic{o:#1}{#2}{#3}}%        % but these also keep the state
   \setgvalue{\??mpgraphic e:#1}{\meta_handle_unique_graphic{e:#1}{#2}{#3}}}        % and meaning will be redefined

\let\stopuniqueMPpagegraphic\relax

\unexpanded\def\uniqueMPpagegraphic
  {\dodoublegroupempty\meta_unique_page_graphic}

\def\meta_unique_page_graphic#1#2%
  {\meta_begin_graphic_group{#1}%
   \let\overlaystamp\overlaypagestamp
%    \setupMPvariables[\m_meta_page_prefix:\currentMPgraphicname][#2]% prefix is new here
   \setupMPvariables[\m_meta_page_prefix:#1][#2]% prefix is new here
   \getvalue{\??mpgraphic\m_meta_page_prefix:#1}{}%
   \meta_end_graphic_group}

%D One way of defining a stamp is:
%D
%D \starttyping
%D \def\extendMPoverlaystamp#1%
%D   {\def\docommand##1%
%D      {\edef\overlaystamp{\overlaystamp:\MPvariable{##1}}}%
%D    \processcommalist[#1]\docommand}
%D \stoptyping

%D Since we need to feed \METAPOST\ with expanded dimensions,
%D we introduce a dedicated expansion engine.

%D We redefine \type {\extendMPoverlaystamp} to preprocess
%D variables using \type {\meta_prepare_variable}.

\unexpanded\def\extendMPoverlaystamp#1%
  {\processcommalist[#1]\meta_extend_overlay_stamp}

\def\meta_extend_overlay_stamp#1%
  {\meta_prepare_instance_variable{#1}%
   \edef\overlaystamp{\overlaystamp:\MPvariable{#1}}}

%D \macros
%D   {MPdatafile}
%D
%D We redefine a macro from \type {supp-mps.tex}:

% This will change ...

\def\MPdataMPDfile{\jobname-mpgraph.mpd}
\def\MPdataMPOfile{\jobname-mpgraph.mpo}
\def\MPdataMPYfile{\jobname-mpgraph.mpy}

\startMPinitializations
    boolean collapse_data; collapse_data:=true;
    def data_mpd_file = "\MPdataMPDfile" enddef ;
    def data_mpo_file = "\MPdataMPOfile" enddef ;
    def data_mpy_file = "\MPdataMPYfile" enddef ;
\stopMPinitializations

\unexpanded\def\getMPdata
  {\let\MPdata\secondoftwoarguments
   \startreadingfile
   % \startnointerference % no, else we need to do all data global
   \readlocfile\MPdataMPDfile\donothing\donothing
   % \stopnointerference
   \stopreadingfile}

% We need this trick because we need to make sure that the tex scanner
% sees newlines and does not quit. Also, we do need to flush the buffer
% under a normal catcode regime in order to expand embedded tex macros.
% As usual with buffers, \type {#1} can be a list.

\unexpanded\def\processMPbuffer
  {\dosingleempty\meta_process_buffer}

\def\meta_process_buffer[#1]%
  {\meta_begin_graphic_group{#1}%
   \meta_process_graphic{\ctxcommand{feedback("\currentMPgraphicname")}}%
   \meta_end_graphic_group}

\unexpanded\def\runMPbuffer
  {\dosingleempty\meta_run_buffer}

\def\meta_run_buffer[#1]% processing only
  {\startnointerference\meta_process_buffer[#1]\stopnointerference}

%D \macros
%D   {startMPenvironment, resetMPenvironment}
%D
%D In order to synchronize the main \TEX\ run and the runs
%D local to \METAPOST, environments can be passed.

% \unexpanded\def\startMPenvironment % second arg gobbles spaces, so that reset gives \emptytoks
%   {\dodoubleempty\dostartMPenvironment}

% \def\dostartMPenvironment[#1][#2]#3\stopMPenvironment
%   {\edef\m_meta_option{#1}
%    \ifx\m_meta_option\s!reset
%      \resetMPenvironment % reset mp toks
%    \else\ifx\m_meta_option\v!global
%      #3%                 % use in main doc too
%    \else\ifx\m_meta_option\!!plustoken
%      #3%                 % use in main doc too
%    \fi\fi\fi
%    \ctxlua{metapost.tex.set(\!!bs\detokenize{#3}\!!es)}}

\unexpanded\def\startMPenvironment
  {\begingroup
   \catcode\endoflineasciicode \ignorecatcode
   \dosingleempty\meta_start_environment}

\def\meta_start_environment[#1]#2\stopMPenvironment
  {\endgroup
   \edef\m_meta_option{#1}
   \ifx\m_meta_option\s!reset
     \resetMPenvironment % reset mp toks
   \else\ifx\m_meta_option\v!global
     #2%                 % use in main doc too
   \else\ifx\m_meta_option\!!plustoken
     #2%                 % use in main doc too
   \fi\fi\fi
   \ctxlua{metapost.tex.set(\!!bs\detokenize{#2}\!!es)}}

\let\stopMPenvironment\relax

\unexpanded\def\resetMPenvironment
  {\ctxlua{metapost.tex.reset()}}

\unexpanded\def\useMPenvironmentbuffer[#1]%
  {\ctxlua{metapost.tex.set(buffers.content("#1"))}}

%D This command takes \type {[reset]} as optional
%D argument.
%D
%D \starttyping
%D \startMPenvironment
%D   \setupbodyfont[pos,14.4pt]
%D \stopMPenvironment
%D
%D \startMPcode
%D   draw btex \sl Hans Hagen etex scaled 5 ;
%D \stopMPcode
%D \stoptyping
%D
%D The most simple case:

\unexpanded\def\startMPcode
  {\dosinglegroupempty\meta_start_code}

\def\meta_start_code
  {\iffirstargument
     \expandafter\meta_start_code_instance
   \else
     \expandafter\meta_start_code_standard
   \fi}

\def\meta_start_code_instance#1#2\stopMPcode
  {\begingroup
   \edef\currentMPinstance{#1}%
   \let\currentMPgraphicname\empty
   \edef\currentMPformat{\MPinstanceparameter\s!format}%
   \meta_enable_include
   \meta_process_graphic{#2}%
   \endgroup}

\def\meta_start_code_standard#1#2\stopMPcode
  {\begingroup
   \let\currentMPinstance\defaultMPinstance
   \let\currentMPgraphicname\empty
   \edef\currentMPformat{\MPinstanceparameter\s!format}%
   \meta_process_graphic{#2}%
   \endgroup}

\let\stopMPcode\relax

\unexpanded\def\MPcode
  {\dodoublegroupempty\meta_code}

\def\meta_code
  {\ifsecondargument
     \expandafter\meta_code_instance
   \else
     \expandafter\meta_code_standard
   \fi}

\def\meta_code_instance#1#2%
  {\meta_begin_graphic_group{#1}%
   \meta_enable_include
   \meta_process_graphic{#2}%
   \meta_end_graphic_group}

\def\meta_code_standard#1#2%
  {\let\currentMPinstance\defaultMPinstance
   \meta_enable_include
   \meta_process_graphic{#1}}

% a bit nasty (also needed for compatibility:

% \startMPrun input mp-www.mp ; \stopMPrun
% \externalfigure[mprun.3][width=10cm,height=8cm]

% \startMPrun{mprun} input mp-www.mp ; \stopMPrun % instance
% \externalfigure[mprun.4][width=10cm,height=8cm]

\let\MPruninstance\defaultMPinstance

\unexpanded\def\useMPrun#1#2% name n
  {\begingroup
   \def\MPaskedfigure{#2}%
   \doifelsenothing{#1}
     {\useMPgraphic{mprun}}%
     {\useMPgraphic{#1}}%
   \endgroup}

\unexpanded\def\startMPrun
  {\dosinglegroupempty\meta_start_run}

\def\meta_start_run#1#2\stopMPrun
  {\iffirstargument
     \startuseMPgraphic{#1}#2\stopuseMPgraphic
   \else
     \startuseMPgraphic{mprun}#2\stopuseMPgraphic
   \fi}

\let\stopMPrun\relax

%D The \type {\resetMPenvironment} is a quick way to erase
%D the token list.
%D
%D You should be aware of independencies. For instance, if you use a font
%D in a graphic that is not used in the main document, you need to load the
%D typescript at the outer level (either directly or by using the global
%D option).
%D
%D \starttyping
%D \usetypescript[palatino][texnansi]
%D
%D \startMPenvironment
%D     \usetypescript[palatino][texnansi]
%D     \enableregime[utf]
%D     \setupbodyfont[palatino]
%D \stopMPenvironment
%D
%D \startMPpage
%D     draw btex aap‒noot coördinatie – één etex ;
%D \stopMPpage
%D \stoptyping

%D Loading specific \METAPOST\ related definitions is
%D accomplished by:

\unexpanded\def\useMPlibrary[#1]{\ctxcommand{useMPlibrary(\!!bs#1\!!es)}}

%D \macros
%D   {setMPtext, MPtext, MPstring, MPbetex}
%D
%D To be documented:
%D
%D \starttyping
%D \setMPtext{identifier}{text}
%D
%D \MPtext  {identifier}
%D \MPstring{identifier}
%D \MPbetex {identifier}
%D \stoptyping

\installcorenamespace{mptext}

\unexpanded\def\setMPtext#1#2% todo : #1 must be made : safe
  {\defconvertedargument\ascii{#2}%
   \dodoglobal\letvalue{\??mptext#1}\ascii}

\def\MPtext  #1{\executeifdefined{\??mptext#1}\empty}
\def\MPstring#1{"\executeifdefined{\??mptext#1}\empty"}
\def\MPbetex #1{btex \executeifdefined{\??mptext#1}\empty\space etex}

%D In order to communicate conveniently with the \TEX\
%D engine, we introduce some typesetting variables.

% \setupcolors[state=stop,conversion=never] % quite tricky ... type mismatch

% A dirty trick, ** in colo-ini.lua (mpcolor).

\def\m_meta_colo_initializations{% no vardef, goes wrong with spot colors
    def OverlayLineColor=\MPcolor{\overlaylinecolor} enddef;
    def OverlayColor=\MPcolor{\overlaycolor} enddef;
}

\startMPextensions
    color OverlayColor,OverlayLineColor;
\stopMPextensions

\startMPinitializations
    CurrentLayout:="\currentlayout";
    OverlayWidth:=\overlaywidth;
    OverlayHeight:=\overlayheight;
    OverlayDepth:=\overlayheight;
    OverlayLineWidth:=\overlaylinewidth;
    %
    \m_meta_colo_initializations
    %
    BaseLineSkip:=\the\baselineskip;
    LineHeight:=\the\baselineskip;
    BodyFontSize:=\the\bodyfontsize;
    %
    TopSkip:=\the\topskip;
    StrutHeight:=\strutheight;
    StrutDepth:=\strutdepth;
    %
    CurrentWidth:=\the\hsize;
    CurrentHeight:=\the\vsize;
    %
    EmWidth:=\the\emwidth;
    ExHeight:=\the\exheight;
    %
    PageNumber:=\the\pageno;
    RealPageNumber:=\the\realpageno;
    LastPageNumber:= \lastpage;
\stopMPinitializations

\appendtoks
    \disablediscretionaries
    \disablecompoundcharacters
\to \everyMPgraphic

% \appendtoks % before color, inefficient, replace by low level copy
%     \doregistercolor{currentcolor}\currentcolorname
% \to \everyMPgraphic

% \color[green]{abc \startMPcode
% fill fullcircle scaled 3cm withoutcolor;
% fill fullcircle scaled 2cm withcolor \MPcolor{currentcolor} ;
% fill fullcircle scaled 1cm withcolor \MPcolor{red} ;
% \stopMPcode def}

\appendtoks
    \baselineskip1\baselineskip
    \lineheight  1\lineheight
    \topskip     1\topskip
\to \everyMPgraphic

\appendtoks
    \let \# \letterhash
    \let \_ \letterunderscore
    \let \& \letterampersand
    \let \{ \letteropenbrace
    \let \} \letterclosebrace
\to \everyMPgraphic

\startMPinitializations
    prologues:=0;
    mpprocset:=1;
\stopMPinitializations

%D \macros
%D   {PDFMPformoffset}
%D
%D In \PDF, forms are clipped and therefore we have to take
%D precautions to get this right. Since this is related to
%D objects, we use the same offset as used there.

\def\PDFMPformoffset{\objectoffset}

% %D \macros
% %D   {insertMPfile}
% %D
% %D Bypassing the special driver and figure mechanism is not
% %D that nice but saves upto 5\% time in embedding \METAPOST\
% %D graphics by using the low level \PDF\ converter directly,
% %D given of course that we use \PDFTEX. As a result we need to
% %D fool around with the object trigger.

\newtoks\everyinsertMPfile

\startMPextensions
    def initialize_form_numbers =
        do_initialize_numbers;
    enddef;
\stopMPextensions

\startMPinitializations
    HSize:=\the\hsize ;
    VSize:=\the\vsize ;
\stopMPinitializations

\startMPextensions
    vardef ForegroundBox =
        unitsquare xysized(HSize,VSize)
    enddef ;
    PageFraction := 1 ;
\stopMPextensions

\startMPinitializations
    PageFraction:=if \lastpage>1:(\realfolio-1)/(\lastpage-1)else:1fi;
\stopMPinitializations

%D And some more. These are not really needed since we
%D don't use the normal figure inclusion macros any longer.

\appendtoks
    \externalfigurepostprocessors\emptytoks % safeguard
\to \everyinsertMPfile

%D We also take care of disabling fancy figure features, that
%D can terribly interfere when dealing with symbols,
%D background graphics and running (postponed) graphics.
%D You won't believe me if I tell you what funny side effects
%D can occur. One took me over a day to uncover when
%D processing the screen version of the \METAFUN\ manual.

\def\doifelseMPgraphic#1%
  {\ifcsname\??mpgraphic   #1\endcsname \expandafter      \firstoftwoarguments  \else
   \ifcsname\??mpgraphic o:#1\endcsname \doubleexpandafter\firstoftwoarguments  \else
   \ifcsname\??mpgraphic e:#1\endcsname \tripleexpandafter\firstoftwoarguments  \else
                                        \tripleexpandafter\secondoftwoarguments \fi\fi\fi}

\let\doifMPgraphicelse\doifelseMPgraphic

%D New:

\definelayerpreset % no dx,dy - else nasty non-mp placement
  [mp]
  [\c!y=-\MPury,
   \c!x=\MPllx,
   \c!method=\v!fit]

\definelayer
  [mp]
  [\c!preset=mp]

%D Usage:
%D
%D \starttyping
%D \defineviewerlayer[one][state=start]
%D \defineviewerlayer[two][state=stop]
%D
%D \startuseMPgraphic{step-1}
%D   fill fullcircle scaled 10cm withcolor red ;
%D \stopuseMPgraphic
%D
%D \startuseMPgraphic{step-2}
%D   fill fullcircle scaled 5cm withcolor green ;
%D \stopuseMPgraphic
%D
%D \setlayer[mp]{\viewerlayer[one]{\useMPgraphic{step-1}}}
%D \setlayer[mp]{\viewerlayer[two]{\useMPgraphic{step-2}}}
%D
%D \ruledhbox{\flushlayer[mp]}
%D \stoptyping
%D
%D Reusing graphics is also possible (now):
%D
%D \starttyping
%D \startreusableMPgraphic{axis}
%D   tickstep := 1cm ; ticklength := 2mm ;
%D   drawticks unitsquare xscaled 4cm yscaled 3cm shifted (-1cm,-1cm) ;
%D   tickstep := tickstep/2 ; ticklength := ticklength/2 ;
%D   drawticks unitsquare xscaled 4cm yscaled 3cm shifted (-1cm,-1cm) ;
%D \stopreusableMPgraphic
%D
%D \startuseMPgraphic{demo}
%D   drawpoint "1cm,1.5cm" ;
%D \stopuseMPgraphic
%D
%D \definelayer[mp][preset=mp]
%D \setlayer[mp]{\reuseMPgraphic{axis}}
%D \setlayer[mp]{\useMPgraphic{demo}}
%D \ruledhbox{\flushlayer[mp]}
%D \stoptyping

%D \macros
%D   {startstaticMPfigure,useMPstaticfigure}
%D
%D Static figures are processed only when there has been
%D something changed. Here is Aditya Mahajan's testcase:
%D
%D \startbuffer
%D \startstaticMPfigure{circle}
%D   fill fullcircle scaled 1cm withcolor blue;
%D \stopstaticMPfigure
%D
%D \startstaticMPfigure{axis}
%D   drawarrow (0,0)--(2cm,0) ;
%D   drawarrow (0,0)--(0,2cm) ;
%D   label.llft(textext("(0,0)") ,origin) ;
%D \stopstaticMPfigure
%D \stopbuffer
%D
%D \typebuffer \getbuffer

\unexpanded\def\startstaticMPfigure#1#2\stopstaticMPfigure
  {\startreusableMPgraphic{\??mpstaticgraphic#1}#2\stopreusableMPgraphic}

\unexpanded\def\startstaticMPgraphic
  {\dodoublegroupempty\meta_start_static_graphic}

\def\meta_start_static_graphic#1#2#3\stopstaticMPgraphic
  {\startreusableMPgraphic{\??mpstaticgraphic#1}{#2}#3\stopreusableMPgraphic}

\let\stopstaticMPfigure \relax
\let\stopstaticMPgraphic\relax

\unexpanded\def\usestaticMPfigure
  {\dodoubleempty\meta_use_static_figure}

\def\meta_use_static_figure[#1][#2]%
  {\ifsecondargument
     \scale[#2]{\reuseMPgraphic{\??mpstaticgraphic#1}}%
   \else
     \reuseMPgraphic{\??mpstaticgraphic#1}%
   \fi}

%D Goody for preventing overflows:

\def\MPdivten[#1]{\withoutpt\the\dimexpr#1pt/10\relax}

%D There is no way to distinguish the black color that you get when
%D you issue a \type {draw} without color specification from a color
%D that has an explicit black specification unless you set the
%D variable \type {defaultcolormodel} to 1. Hoewever, in that case
%D you cannot distinguish that draw from one with a \type
%D {withoutcolor} specification. This means that we have to provide
%D multiple variants of inheritance.
%D
%D In any case we need to tell the converter what the inherited color
%D is to start with. Case~3 is kind of unpredictable as it closely
%D relates to the order in which paths are flushed. If you want to
%D inherit automatically from the surrounding, you can best stick to
%D variant 1. Variant 0 (an isolated graphic) is the default.
%D
%D \startbuffer
%D \startuseMPgraphic{test}
%D     drawoptions(withpen pencircle scaled 1pt) ;
%D     def shift_cp = currentpicture := currentpicture shifted (-15pt,0) ; enddef ;
%D     draw fullcircle scaled 10pt withoutcolor  ; shift_cp ;
%D     fill fullcircle scaled 10pt               ; shift_cp ;
%D     draw fullcircle scaled 10pt withoutcolor  ; shift_cp ;
%D     fill fullcircle scaled 10pt withcolor red ; shift_cp ;
%D     draw fullcircle scaled 10pt withoutcolor  ; shift_cp ;
%D     fill fullcircle scaled 10pt               ; shift_cp ;
%D \stopuseMPgraphic
%D
%D \starttabulate
%D \NC 0\quad \NC \MPcolormethod0 \green XX\quad \useMPgraphic{test}\quad XX \NC \NR
%D \NC 1\quad \NC \MPcolormethod1 \green XX\quad \useMPgraphic{test}\quad XX \NC \NR
%D \NC 2\quad \NC \MPcolormethod2 \green XX\quad \useMPgraphic{test}\quad XX \NC \NR
%D \NC 3\quad \NC \MPcolormethod3 \green XX\quad \useMPgraphic{test}\quad XX \NC \NR
%D \stoptabulate
%D \stopbuffer
%D
%D \typebuffer \getbuffer

\newconstant\MPcolormethod

\appendtoks
    \ctxlua{metapost.setoutercolor(\number\MPcolormethod,\number\attribute\colormodelattribute,\number\attribute\colorattribute,\number\dogetattribute{transparency})}%
\to \everyMPgraphic

\startMPinitializations
    defaultcolormodel := \ifcase\MPcolormethod1\or1\or3\else3\fi;
\stopMPinitializations

%D \macros
%D   {setupMPgraphics}
%D
%D Here is a generic setup command:

\installcorenamespace{MPgraphics}

\installsetuponlycommandhandler \??MPgraphics {MPgraphics}

%D Here we hook in the outer color. When \type {color} is set to \type
%D {global} we get the outer color automatically. If you change this
%D setting, you should do it grouped in order not to make other graphics
%D behave in unexpected ways.

\appendtoks
    \doifelse{\directMPgraphicsparameter\c!color}\v!global{\MPcolormethod\plusone}{\MPcolormethod\zerocount}%
\to \everysetupMPgraphics

\setupMPgraphics
  [\c!color=\v!local]

%D Done.

\protect \endinput

[-- Attachment #1.2.3: Type: text/html, Size: 264 bytes --]

[-- Attachment #2: Type: text/plain, Size: 485 bytes --]

___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the Wiki!

maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
webpage  : http://www.pragma-ade.nl / http://tex.aanhet.net
archive  : http://foundry.supelec.fr/projects/contextrev/
wiki     : http://contextgarden.net
___________________________________________________________________________________

  reply	other threads:[~2013-05-15 10:15 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-05-14 12:23 Keith J. Schultz
2013-05-14 17:57 ` Hans Hagen
2013-05-15  7:36   ` Keith J. Schultz
2013-05-15 10:15     ` Keith J. Schultz [this message]
2013-05-15 11:04       ` Hans Hagen
2013-05-15 14:23         ` Keith J. Schultz

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=E8E3EA93-6F24-4329-B962-B7B365314FAF@web.de \
    --to=keithjschultz@web.de \
    --cc=ntg-context@ntg.nl \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).