From 8d8d528d2ad52599f11250cfc567fea4f37f2a8b Mon Sep 17 00:00:00 2001 From: Context Git Mirror Bot Date: Tue, 12 Jan 2016 17:15:07 +0100 Subject: 2016-01-12 16:26:00 --- tex/context/base/mkiv/meta-ini.mkiv | 1567 +++++++++++++++++++++++++++++++++++ 1 file changed, 1567 insertions(+) create mode 100644 tex/context/base/mkiv/meta-ini.mkiv (limited to 'tex/context/base/mkiv/meta-ini.mkiv') diff --git a/tex/context/base/mkiv/meta-ini.mkiv b/tex/context/base/mkiv/meta-ini.mkiv new file mode 100644 index 000000000..9f53aea69 --- /dev/null +++ b/tex/context/base/mkiv/meta-ini.mkiv @@ -0,0 +1,1567 @@ +%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 + {\clf_setmpextensions{#1}{#2}} + +\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}} + +\let\meta_preset_definitions\relax + +\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}::::]} + +\def\meta_show_properties_indeed + {\writestatus{metapost}{name: \currentMPgraphicname, instance: \currentMPinstance, format: \currentMPformat}} + +\let\meta_show_properties\donothing + +\installtextracker + {metapost.properties} + {\let\meta_show_properties\meta_show_properties_indeed} + {\let\meta_show_properties\donothing} + +\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}% + \meta_show_properties} + +\def\currentMPgraphicname{\s!unknown} +\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[lessfun] [\s!format=metafun] +\defineMPinstance[doublefun] [\s!format=metafun,\s!extensions=\v!yes,\s!initializations=\v!yes,\c!method=\s!double] +\defineMPinstance[binaryfun] [\s!format=metafun,\s!extensions=\v!yes,\s!initializations=\v!yes,\c!method=\s!binary] +\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] +\defineMPinstance[doublepost] [\s!format=mpost,\c!method=\s!double] +\defineMPinstance[binarypost] [\s!format=mpost,\c!method=\s!binary] +\defineMPinstance[decimalpost][\s!format=mpost,\c!method=\s!decimal] + +%defineMPinstance[megapost] [\s!format=mpost,\c!method=\s!decimal] + +\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 + \useMPinstancestyleparameter\c!textstyle} + +\def\meta_set_current_color + {\useMPinstancecolorparameter\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\hpack\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\clf_mpgraphic + instance {\currentMPinstance}% + format {\currentMPformat}% + data {#1;}% + initializations {\meta_flush_current_initializations}% + \ifx\p_extensions\v!yes + extensions {\clf_getmpextensions{\currentMPinstance}}% goes through tex again + \fi + inclusions {\meta_flush_current_inclusions}% + definitions {\meta_flush_current_definitions}% + figure {\MPaskedfigure}% + method {\MPinstanceparameter\c!method}% + \relax}% + \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[\c!offset=\v!overlay,\c!align=]\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 + +\let\theMPrandomseed\empty + +\def\setMPrandomseed + {\ifsetMPrandomseed + \def\theMPrandomseed{randomseed:=\mprandomnumber;}% + \else + \let\theMPrandomseed\empty + \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} +% +% but ... we want this too: +% +% \startuseMPgraphic{x} +% draw textext("\externalfigure[foo.pdf]") ; +% \stopuseMPgraphic +% +% \useMPgraphic{x} +% +% so we cannot overload unless we let back to the original meanings +% each graphic ... a better solution is: + +\def\includeMPgraphic#1% gets expanded ! + {\ifcsname\??mpgraphic#1\endcsname + %\doubleexpandafter\fourthoffourarguments\csname\??mpgraphic#1\endcsname ; % ; is safeguard + \doubleexpandafter\fourthoffourarguments\lastnamedcs ; % ; is safeguard + \fi} + +\let\meta_enable_include\relax + +%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}% \let\overlaywidth \width + \edef\height{#3}% \let\overlayheight\height + \d_overlay_width #2\onebasepoint + \d_overlay_height#3\onebasepoint + \edef\currentMPclip{#1}% + \ifcsname\??mpclip\currentMPclip\endcsname + \meta_grab_clip_path_indeed + \ifx\MPclippath\empty + \xdef\MPclippath{#4}% + \fi + \else + \xdef\MPclippath{#4}% + \fi + \endgroup} + +\def\meta_grab_clip_path_indeed + {\meta_start_current_graphic + \normalexpanded{\noexpand\clf_mpsetclippath + instance {\currentMPinstance}% + format {\currentMPformat}% + data {\csname\??mpclip\currentMPclip\endcsname}% + initializations {\meta_flush_current_initializations}% + useextensions {\MPinstanceparameter\s!extensions}% + inclusions {\meta_flush_current_inclusions}% + method {\MPinstanceparameter\c!method}% + \relax}% + \meta_stop_current_graphic} + +%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\clf_currentdesignsize\scaledpoint\relax + \endgroup} + +\definefontsynonym[MetafunDefault][Regular*default] + +\startMPinitializations % scale is not yet ok + defaultfont:="\truefontname{MetafunDefault}"; + % defaultscale:=\the\bodyfontsize/10pt; % only when hard coded 10pt + % defaultscale:=1; +\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} + {\begincsname\??graphicvariable#1:#2\endcsname} + +\def\MPvariable#1% todo: could be a framed chain + %{\csname\??graphicvariable\currentmpvariableclass:#1\endcsname} + {\begincsname\??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 + \doifelsecolor \ascii % with 2\bodyfontsize + {\meta_prepare_variable_color} + {\begingroup + \setbox\b_meta_variable_box\hpack{\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 + {\the\d_overlay_width :% + \the\d_overlay_height :% + \the\d_overlay_depth :% + \the\d_overlay_offset :% + \the\d_overlay_linewidth:% + \MPcolor\overlaycolor :% % todo, expand once \m_overlaycolor + \MPcolor\overlaylinecolor} % todo, expand once \m_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\hpack\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\hpack\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% + \hpack{\forcecolorhack\getobject{MP}{#1}}} % else no proper color intent + +% \unexpanded\def\meta_use_box +% {\setobject{MP}} + +\unexpanded\def\meta_use_box + {\setunreferencedobject{MP}} + +\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 + \meta_use_box{\number\c_meta_object_counter}\hpack{\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 + \csname\??mpgraphic\overlaystamp:#1\endcsname\empty + \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]% + \csname\??mpgraphic#1\endcsname\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 + \meta_use_box{\number\c_meta_object_counter}\hpack{\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}}% + \csname\??mpgraphic#1\endcsname\empty + \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]}% + \csname\??mpgraphic#1\endcsname\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 + +%D \macros +%D {startuniqueMPpagegraphic,uniqueMPpagegraphic} +%D +%D Experimental. + +\def\m_meta_page_prefix{\doifelseoddpage oe} + +% \def\overlaypagestamp +% {\m_meta_page_prefix:\overlaywidth:\overlayheight:\overlaydepth:\MPcolor\overlaycolor:\MPcolor\overlaylinecolor} + +\def\overlaypagestamp + {\m_meta_page_prefix :% + \the\d_overlay_width :% + \the\d_overlay_height :% + \the\d_overlay_depth :% + \the\d_overlay_offset :% + \the\d_overlay_linewidth:% + \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 + \csname\??mpgraphic\m_meta_page_prefix:#1\endcsname\empty + \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} % this one will become obsolete +\def\MPdataMPOfile{\jobname-mpgraph.mpo} +\def\MPdataMPYfile{\jobname-mpgraph.mpy} + +% makempy.registerfile(filename) + +% % hm. extensions get expanded so the wrong names then end up in format +% +% \startMPinitializations +% boolean collapse_data; collapse_data:=true ; % will be obsolete +% def data_mpd_file = "\MPdataMPDfile" enddef ; % will go via lua +% def data_mpo_file = "\MPdataMPOfile" enddef ; +% def data_mpy_file = "\MPdataMPYfile" enddef ; +% \stopMPinitializations + +\startMPextensions + boolean collapse_data; collapse_data:=true ; % will be obsolete + def data_mpd_file = "\noexpand\MPdataMPDfile" enddef ; % will go via lua + def data_mpo_file = "\noexpand\MPdataMPOfile" enddef ; + def data_mpy_file = "\noexpand\MPdataMPYfile" enddef ; +\stopMPextensions + +\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{\clf_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 + \clf_mptexset{\detokenize{#2}}} + +\let\stopMPenvironment\relax + +\unexpanded\def\resetMPenvironment + {\clf_mptexreset} + +\unexpanded\def\useMPenvironmentbuffer[#1]% + {\clf_mptexsetfrombuffer{#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]{\clf_useMPlibrary{#1}} + +%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{\begincsname\??mptext#1\endcsname\empty} +\def\MPstring#1{"\begincsname\??mptext#1\endcsname\empty"} +\def\MPbetex #1{btex \begincsname\??mptext#1\endcsname\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 + +% \startMPextensions +% color OverlayColor,OverlayLineColor; +% \stopMPextensions + +\startMPinitializations + CurrentLayout:="\currentlayout"; +\stopMPinitializations + +% \startMPinitializations +% OverlayWidth:=\overlaywidth; +% OverlayHeight:=\overlayheight; +% OverlayDepth:=\overlaydepth; +% OverlayLineWidth:=\overlaylinewidth; +% OverlayOffset:=\overlayoffset; +% \stopMPinitializations + +% A dirty trick, ** in colo-ini.lua (mpcolor). We cannot use a vardef, because +% that fails with spot colors. + +\startMPinitializations + def OverlayLineColor=\ifx\overlaylinecolor\empty black \else\MPcolor{\overlaylinecolor} \fi enddef; + def OverlayColor =\ifx\overlaycolor \empty black \else\MPcolor{\overlaycolor} \fi enddef; +\stopMPinitializations + +% \newcount\c_overlay_colormodel +% \newcount\c_overlay_color +% \newcount\c_overlay_transparency +% \newcount\c_overlay_linecolor +% \newcount\c_overlay_linetransparency + +% \appendtoks +% \c_overlay_colormodel \attribute\colormodelattribute +% \c_overlay_color \colo_helpers_inherited_current_ca\overlaycolor +% \c_overlay_transparency \colo_helpers_inherited_current_ta\overlaycolor +% \c_overlay_linecolor \colo_helpers_inherited_current_ca\overlaylinecolor +% \c_overlay_linetransparency\colo_helpers_inherited_current_ta\overlaylinecolor +% \to \everyMPgraphic + +% \startMPinitializations +% BaseLineSkip:=\the\baselineskip; +% LineHeight:=\the\baselineskip; +% BodyFontSize:=\the\bodyfontsize; +% % +% TopSkip:=\the\topskip; +% StrutHeight:=\strutheight; +% StrutDepth:=\strutdepth; +% % +% CurrentWidth:=\the\hsize; +% CurrentHeight:=\the\vsize; +% HSize:=\the\hsize ; +% VSize:=\the\vsize ; +% % +% EmWidth:=\the\emwidth; +% ExHeight:=\the\exheight; +% \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 + +%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 + +\startMPextensions + vardef ForegroundBox = + unitsquare xysized(HSize,VSize) + enddef ; +\stopMPextensions + +% \startMPextensions +% PageFraction := 1 ; +% \stopMPextensions + +% \startMPinitializations +% PageFraction := if \lastpage>1: (\realfolio-1)/(\lastpage-1) else: 1 fi ; +% \stopMPinitializations + +\startMPdefinitions {metapost} + if unknown context_bare : input mp-bare.mpiv ; fi ; +\stopMPdefinitions +\startMPdefinitions {binarypost} + if unknown context_bare : input mp-bare.mpiv ; fi ; +\stopMPdefinitions +\startMPdefinitions {decimalpost} + if unknown context_bare : input mp-bare.mpiv ; fi ; +\stopMPdefinitions +\startMPdefinitions {doublepost} + if unknown context_bare : input mp-bare.mpiv ; fi ; +\stopMPdefinitions + +% \startMPdefinitions {nofun} +% if unknown context_bare : input mp-bare.mpiv ; fi ; +% \stopMPdefinitions + +%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 + \clf_mpsetoutercolor + \MPcolormethod\space + \attribute\colormodelattribute\space + \attribute\colorattribute\space + \dogetattribute{transparency}\relax +\to \everyMPgraphic + +% \startMPinitializations +% defaultcolormodel := \ifcase\MPcolormethod1\or1\or3\else3\fi; +% \stopMPinitializations + +%D macros +%D {mprunvar,mpruntab,mprunset} +%D +%D \starttyping +%D \startMPcode +%D passvariable("version","1.0") ; +%D passvariable("number",123) ; +%D passvariable("string","whatever") ; +%D passvariable("point",(1.5,2.8)) ; +%D passvariable("triplet",(1/1,1/2,1/3)) ; +%D passvariable("quad",(1.1,2.2,3.3,4.4)) ; +%D passvariable("boolean",false) ; +%D passvariable("path",fullcircle scaled 1cm) ; +%D draw fullcircle scaled 20pt ; +%D \stopMPcode +%D +%D \ctxlua{inspect(metapost.variables)} +%D +%D \MPrunvar{version} \MPruntab{quad}{3} (\MPrunset{triplet}{,}) +%D +%D $(x,y) = (\MPruntab{point}{1},\MPruntab{point}{2})$ +%D $(x,y) = (\MPrunset{point}{,})$ +%D \stoptyping + +\def\MPrunvar #1{\clf_mprunvar{#1}} \let\mprunvar\MPrunvar +\def\MPruntab#1#2{\clf_mpruntab{#1}#2\relax} \let\mpruntab\MPruntab % #2 is number +\def\MPrunset#1#2{\clf_mprunset{#1}{#2}} \let\mprunset\MPrunset + +%D We also provide an outputless run: + +\unexpanded\def\startMPcalculation + {\begingroup + \setbox\nextbox\hpack\bgroup + \dosinglegroupempty\meta_start_calculation} + +\def\meta_start_calculation + {\iffirstargument + \expandafter\meta_start_calculation_instance + \else + \expandafter\meta_start_calculation_standard + \fi} + +\def\meta_start_calculation_instance#1#2\stopMPcalculation + {\edef\currentMPinstance{#1}% + \let\currentMPgraphicname\empty + \edef\currentMPformat{\MPinstanceparameter\s!format}% + \meta_enable_include + \meta_process_graphic{#2;draw origin}% + \egroup + \endgroup} + +\def\meta_start_calculation_standard#1#2\stopMPcalculation + {\let\currentMPinstance\defaultMPinstance + \let\currentMPgraphicname\empty + \edef\currentMPformat{\MPinstanceparameter\s!format}% + \meta_process_graphic{#2;draw origin}% + \egroup + \endgroup} + +\let\stopMPcalculation\relax + +%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 This can save some runtime: rename the mpy file from a first run (when stable) to +%D another file and reuse it. One can also use the original filename, but a copy is +%D often better. +%D +%D \starttyping +%D \setupMPgraphics +%D [mpy=\jobname.mpy] +%D \stoptyping + +\appendtoks + \edef\p_mpy{\directMPgraphicsparameter{mpy}}% + \ifx\p_mpy\empty \else + \let\MPdataMPYfile\p_mpy + \clf_registermpyfile{\p_mpy}% + \fi +\to \everysetupMPgraphics + +%D Done. + +\protect \endinput -- cgit v1.2.3