diff options
author | Karl Berry <karl@freefriends.org> | 2011-03-11 23:57:57 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2011-03-11 23:57:57 +0000 |
commit | 9860f8848b76b157121e0dd83ed89a32858bf598 (patch) | |
tree | 8ba000143965668d761ecc9203469906af7f7456 /Master/texmf-dist | |
parent | b8a676e6a9163cce8c8630c430b5501fe16562bd (diff) |
new latex/metapost package gmp (10mar11)
git-svn-id: svn://tug.org/texlive/trunk@21691 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist')
-rw-r--r-- | Master/texmf-dist/doc/latex/gmp/README | 49 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/gmp/gmp.pdf | bin | 0 -> 801895 bytes | |||
-rw-r--r-- | Master/texmf-dist/source/latex/gmp/gmp.dtx | 2339 | ||||
-rw-r--r-- | Master/texmf-dist/source/latex/gmp/gmp.ins | 71 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/gmp/gmp.sty | 329 |
5 files changed, 2788 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/latex/gmp/README b/Master/texmf-dist/doc/latex/gmp/README new file mode 100644 index 00000000000..3830226de0d --- /dev/null +++ b/Master/texmf-dist/doc/latex/gmp/README @@ -0,0 +1,49 @@ + +The gmp package allows integration between MetaPost +pictures and LaTeX, the main feature is that passing +parameters to the MetaPost pictures is possible and +the picture code can be put inside arguments to +commands, including \newcommand. + +This is version 1.0 of the package + +Copyright (C) 2011 by Enrico Gregorio +<Enrico dot Gregorio at univr dot it> +------------------------------------------------------- + +This work may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either +version 1.3c of this license or (at your option) any +later version. The latest version of this license is in + http://www.latex-project.org/lppl.txt +and version 1.3 or later is part of all distributions +of LaTeX version 2005/12/01 or later. + +This work has the LPPL maintenance status `maintained'. + +The Current Maintainer of this work is Enrico Gregorio. + +This work consists of the files + gmp.dtx + gmp.ins +and the derived file gmp.sty. + +To install the distribution: + +o run "latex gmp.ins" +o move "gmp.sty" to locations where LaTeX will find + it (the FAQ on CTAN in [...]/help/uktug-FAQ gives + information about this magic place + +To produce the documentation in pdf format: + +o run "pdflatex -shell-escape gmp.dtx" +o run "makeindex -s gind.ist gmp" +o run "makeindex -s gglo.ist -o gmp.gls gmp.glo" +o run "pdflatex gmp.dtx" + +Notice that producing the documentation requires +that the gmp.sty file can be found by LaTeX + +2011/03/10 +Enrico Gregorio diff --git a/Master/texmf-dist/doc/latex/gmp/gmp.pdf b/Master/texmf-dist/doc/latex/gmp/gmp.pdf Binary files differnew file mode 100644 index 00000000000..26261144712 --- /dev/null +++ b/Master/texmf-dist/doc/latex/gmp/gmp.pdf diff --git a/Master/texmf-dist/source/latex/gmp/gmp.dtx b/Master/texmf-dist/source/latex/gmp/gmp.dtx new file mode 100644 index 00000000000..457f80450c8 --- /dev/null +++ b/Master/texmf-dist/source/latex/gmp/gmp.dtx @@ -0,0 +1,2339 @@ +% \iffalse meta-comment +% +% Copyright (C) 2011 by Enrico Gregorio +% <Enrico dot Gregorio at univr dot it> +% ------------------------------------------------------- +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either +% version 1.3c of this license or (at your option) any +% later version. The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3 or later is part of all distributions +% of LaTeX version 2005/12/01 or later. +% +% This work has the LPPL maintenance status `maintained'. +% +% The Current Maintainer of this work is Enrico Gregorio. +% +% This work consists of the files +% gmp.dtx +% gmp.ins +% and the derived file gmp.sty. +% +% \fi +% +% \iffalse +%<*driver> +\ProvidesFile{gmp.dtx} +%</driver> +%<package>\NeedsTeXFormat{LaTeX2e}[2008/04/05] +%<package>\ProvidesPackage{gmp} +%<*package> + [2011/03/10 v1.0 Integrate MetaPost with LaTeX (EG)] +%</package> +% +%<*driver> +\documentclass{ltxdoc} +\usepackage[T1]{fontenc} +\usepackage[latin1]{inputenc} +\usepackage[shellescape,tex]{gmp} +\usepackage{url,float,microtype} +\usepackage{metalogo,mflogo,color} +\floatstyle{ruled} +\restylefloat{figure} +\restylefloat{table} + +% \newenvironment{averbatim}{\verbatim}{\endverbatim} +\newenvironment{annotation} + {\par\addvspace{\medskipamount}\footnotesize} + {\par\addvspace{\medskipamount}} + +\newcommand{\cmdname}[1]{\texttt{\char`\\#1}} +\renewcommand{\meta}[1]{$\langle$\textnormal{\itshape#1\/}$\rangle$} +\renewcommand{\marg}[1]{\texttt{\char`\{#1\char`\}}} +\renewcommand{\oarg}[1]{\texttt{[#1]}} + +\newcommand{\scratchcount}[1]{% +\begin{mpost} +n:=#1; +height := 3/5\mpdim{\baselineskip} ; +span := 1/3 * height ; +drift := 1/10 * height ; +pickup pencircle scaled (1/12 * height) ; +def d = (uniformdeviate drift) enddef ; +for i := 1 upto n : + draw + if (i mod 5)=0 : ((-d-4.5span,d)--(+d-0.5span,height-d)) + else : ((-d,+d)--(+d,height-d)) fi + shifted (span*i,d-drift) ; +endfor; +picture cp ; +cp := currentpicture ; % for readability +setbounds currentpicture to + (llcorner cp shifted (0,-ypart llcorner cp) -- + lrcorner cp shifted (0,-ypart lrcorner cp) -- + urcorner cp -- ulcorner cp -- cycle) ; +\end{mpost}} +\makeatletter +\newenvironment{scratchenum}{\begin{enumerate}% +\@namedef{label\@enumctr}{\scratchcount{\arabic{\@enumctr}}}% +}{\end{enumerate}} +\makeatother + +\newcommand\VCEN[1]{$\vcenter{\hbox{#1}}$} +\newcommand\lista[2][black]{% +\VCEN{% +\begin{mpost}[ +%mpcommands={n:=#3;color fuzzy_color ; fuzzy_color:=#1 ;}, +mpmem=metafun] +n:=#2 ; color fuzzy_color ; fuzzy_color:=#1 ; + +height := 5pt ; +span := 1/3 * height ; +drift := 1/10 * height ; +hsize := .7\mpdim{\linewidth} ; +vstep := 10pt ; +xmax := hsize div 5span ; + +pickup pencircle scaled (1/12 * height) ; +def d = (uniformdeviate drift) enddef ; +for i := 1 upto n : + xpos := ((i-1) mod (5*xmax))*span ; + ypos := ((i-1) div (5*xmax))*vstep ; + draw + if (i mod 5)=0 : ((-d-4.5span,d)--(+d-0.5span,height-d)) + else : ((-d,+d)--(+d,height-d)) fi + shifted (xpos,-ypos+d-drift) withcolor fuzzy_color ; +endfor; + +picture cp ; +cp := currentpicture ; % for readability +if (ypart ulcorner cp - ypart llcorner cp) <= vstep : +setbounds currentpicture to + (llcorner cp shifted (0,-ypart llcorner cp) -- + lrcorner cp shifted (0,-ypart lrcorner cp) -- + urcorner cp -- ulcorner cp -- cycle) ; +fi +\end{mpost}}% +} + +\newsavebox{\tacochapterbox} +\newcommand{\tacochapterhead}[1]{% + \sbox\tacochapterbox{\Large\bfseries #1}% + {\ooalign{% + \MPclipOne{\mpdim{\wd\tacochapterbox+6pc}} + {\mpdim{\ht\tacochapterbox+3pc}} + {8} + {(.7,.7,.7)} + {red} + \cr + \hfill\raisebox{\dimexpr.5\ht\tacochapterbox+1.5pc\relax} + {\box\tacochapterbox}\hfill}}} + +\def\MPclipOne#1#2#3#4#5{\begin{mpost} + w := #1; width := 100; wfactor := w/width; + h := #2; height := 100; hfactor := h/height; + color lightred; lightred := (.90,.50,.50); + color lightgray; lightgray := (.95,.95,.95); + color gray; gray := (.50,.50,.50); + def random_delta (expr d) = + d-(uniformdeviate 2d) + enddef; + z1 = (0,height); + z2 = (0,0); + z3 = (width,0); + z4 = (width,height); + z5 = (width+random_delta(.2width),height+random_delta(.2height)); + z6 = (.5width+random_delta(.1width),height+random_delta(.1height)); + pickup pencircle + xscaled (#3/wfactor) + yscaled (#3/(2*hfactor)) + rotated 30; + draw z5..z1..z2..z3..z4..z6 withcolor #4; + pickup pencircle + xscaled (#3/wfactor) + yscaled (#3/hfactor); + draw z1 withcolor #5; + draw z2 withcolor #5; + draw z3 withcolor #5; + draw z4 withcolor #5; + draw z5 withcolor #5; + draw z6 withcolor #5; + newwidth := (xpart (urcorner currentpicture)) - + (xpart (llcorner currentpicture)); + newheight := (ypart (urcorner currentpicture)) - + (ypart (llcorner currentpicture)); + currentpicture := currentpicture + xscaled (w/newwidth) yscaled (h/newheight); + \end{mpost}} + +\newcommand{\squares}[2][black]{% + \begin{mpost} + boolean timetofillbox; + sfactor:=.95; + path p,q; u:=\mpdim{#2\textwidth}/2; + p := (u,u) -- (-u,u) -- (-u,-u) -- (u,-u) -- cycle; + theta := 0; dtheta := .005; + forever: + theta := theta+dtheta; + q := p scaled sfactor rotated theta; + exitif ypart(point 0 of q) > u; + endfor; + fill p withrgbcolor #1; timetofillbox:=false; + for i:=1 upto 51: + p := p scaled sfactor rotated theta; + if timetofillbox: + fill p withrgbcolor #1; timetofillbox:=false; + else: + fill p withrgbcolor white-#1; timetofillbox:=true; + fi + endfor + \end{mpost}} + +\urldef\messageurl\url + {http://groups.google.com/group/comp.text.tex/browse_frm/thread/516fb024bb83bcda} + +\setcounter{secnumdepth}{1} + +\EnableCrossrefs +\CodelineIndex +\RecordChanges +\begin{document} + \DocInput{gmp.dtx} + \PrintChanges + \PrintIndex +\end{document} +%</driver> +% \fi +% +% \CheckSum{698} +% +% \CharacterTable +% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +% Digits \0\1\2\3\4\5\6\7\8\9 +% Exclamation \! Double quote \" Hash (number) \# +% Dollar \$ Percent \% Ampersand \& +% Acute accent \' Left paren \( Right paren \) +% Asterisk \* Plus \+ Comma \, +% Minus \- Point \. Solidus \/ +% Colon \: Semicolon \; Less than \< +% Equals \= Greater than \> Question mark \? +% Commercial at \@ Left bracket \[ Backslash \\ +% Right bracket \] Circumflex \^ Underscore \_ +% Grave accent \` Left brace \{ Vertical bar \| +% Right brace \} Tilde \~} +% +% +% \changes{v1.0}{2011/03/10}{Initial version} +% +% \GetFileInfo{gmp.dtx} +% +% \DoNotIndex{\newcommand,\newenvironment,\!,\",\%,\',\:,\;,\=,\?} +% \DoNotIndex{\@gobbletwo,\@ifundefined,\@makeother,\@nameuse,\@ne} +% \DoNotIndex{\@onlypreamble,\@temp,\^,\`,\|,\~,\active,\advance,\@nil} +% \DoNotIndex{\begin,\begingroup,\bgroup,\catcode,\chardef,\closeout} +% \DoNotIndex{\color,\count@,\csname,\def,\define@key,\dimexpr,\@gobble} +% \DoNotIndex{\do,\documentclass,\edef,\egroup,\else,\empty,\end,} +% \DoNotIndex{\endcsname,\endgroup,\endinput,\expandafter,\fbox,\fi} +% \DoNotIndex{\gdef,\global,\ifdefined,\IfFileExists,\ifnum,\ifx} +% \DoNotIndex{\immediate,\jobname,\label,\lccode,\let,\long,\loop} +% \DoNotIndex{\lowercase,\m@ne,\message,\MessageBreak,\newcounter} +% \DoNotIndex{\newif,\newlinechar,\newtoks,\noexpand,\number} +% \DoNotIndex{\PackageError,\PackageWarning,\PackageWarningNoLine} +% \DoNotIndex{\par,\refstepcounter,\relax,\repeat,\RequirePackage} +% \DoNotIndex{\space,\string,\the,\toks@,\usepackage,\x,\xdef,\z@} +% +% +% \title{The \textsf{gmp} package\thanks{This document +% corresponds to \textsf{gmp}~\fileversion, dated \filedate.}} +% \author{Enrico Gregorio \\ \texttt{enrico DOT gregorio AT univr DOT it}} +% +% \maketitle +% +% \begin{center} +% \tacochapterhead{Introduction} +% \end{center} +% +% Con\TeX{}t is far more superior to \LaTeX{} in its integration of +% \MP{}. On the other hand, few people are going to do the big jump +% towards Con\TeX{}t, especially if they have to use maths in their +% documents. +% +% Nonetheless, sometimes a better integration between \LaTeX{} and +% \MP{} would be welcome. One great package is \textsf{mfpic}, but +% its philosophy is different: it defines a set of \TeX{} macros which +% are afterwards interpreted as \MP{}. It suffers a bit from its +% \MF{} origin: the user has to pass the dimensions of the created +% figure in advance, while \MP{} is able to figure them out by itself. +% +% A very recent package does similar things as \textsf{gmp}, Vafa +% Khalighi's \mbox{\textsf{mpgraphics}}, from which I learned to add +% the \texttt{runs} and \texttt{clean} keys. However also Vafa's +% package can't pass parameters to the \MP{} pictures at run time. +% I~have to thank Vafa Khalighi because his \textsf{mpgraphics} +% package helped me to straighten some roughness from the preliminary +% version of this package. Another package is oriented to this +% purpose, \textsf{emp} by Thorsten Ohl, but it has not been updated +% since 1997. +% +% What I wanted was a package which could do \emph{automatically} the +% compilation of \MP{} output and, moreover, could pass parameters to +% \MP{}. Wouldn't it be nice being able to define a graphic object in +% terms of the current text width? Or of the current baseline skip? +% Or of some user defined parameter? A ``reusable'' object which can +% change depending on current conditions? This package is an answer; +% it runs under \LaTeX{}, \textsc{pdf}\LaTeX{} and +% \XeLaTeX{}.\footnote{It runs even under Lua\LaTeX{}, I'd say, but in +% this case it doesn't exploit the possibility of a direct call to the +% \MP{} library.} +% +% This has some consequences; for example, \MP{} labels will usually go +% inside +%\begin{verbatim} +%\btex ... etex +%\end{verbatim} +% instead of the normal \verb|btex ... etex|. Later examples will show +% this is an enrichment, rather than a limitation. +% +% \begin{mpost}[name=swelled] +% breadth=.667\mpdim{\linewidth}; +% height=2pt; +% x1=0; +% x2=x6=.333x4;x5=x3=.667x4; +% x4=breadth; +% y1=y4=height/2; +% y2=y3=height; +% y5=y6=0; +% fill z1--z2--z3--z4--z5--z6--cycle; +% \end{mpost} +% +% Consider a swelled rule: we want its width to be two thirds of the +% line width. But, of course, we should not simply scale it when the +% line width changes. Here is an example; the swelled rule for the +% current line width: +% \begin{center} +% \usempost{swelled} +% \end{center} +% We follow it with a scaled version corresponding to half line width +% (on the left) and a true swelled rule constructed for a halved line +% width: +% \begin{center} +% % \scalebox{.5}[1]{\usempost{swelled}}\qquad +% \usempost[scale=.5]{swelled}\qquad +% \begin{mpost} +% breadth=.667\mpdim{\linewidth}/2; +% height=2pt; +% x1=0; +% x2=x6=.333x4;x5=x3=.667x4; +% x4=breadth; +% y1=y4=height/2; +% y2=y3=height; +% y5=y6=0; +% fill z1--z2--z3--z4--z5--z6--cycle; +% \end{mpost} +% \end{center} +% +% The difference is clear, but I must admit to have cheated: in this +% case it would be sufficient to scale the swelled rule only in the +% horizontal direction. However, scaling is not always the correct +% answer, since it affects all rule widths and character sizes, for +% example. You can see the input for the swelled rule in +% Figure~\ref{swelled-code}, taken from~Peter~\cite{peter2005}. +% +% \begin{figure} +% \centering +% \bigskip +% \usempost{swelled}\\*[3ex] +% \begin{minipage}{.5\linewidth} +%\begin{verbatim} +%\begin{mpost}[name=swelled] +%breadth=.667\mpdim{\linewidth}; +%height=2pt; +%x1=0; +%x2=x6=.333x4;x5=x3=.667x4; +%x4=breadth; +%y1=y4=height/2; +%y2=y3=height; +%y5=y6=0; +%fill z1--z2--z3--z4-- +% z5--z6--cycle; +%\end{mpost} +%\end{verbatim} +% \end{minipage}\\*[3ex] +% \usempost{swelled} +% +% \bigskip +% \caption{The code for the swelled rule}\label{swelled-code} +% \end{figure} +% +% The command \cmdname{mpdim} takes as an argument a length (rigid or +% rubber) and transforms it into a dimension understood by \MP{} +% (i.e., it strips off possible `plus' and `minus' specifications). To +% \MP{} eyes, it is an `unnamed variable' like `\texttt{whatever}', +% except that it has the value of the dimension given as argument; see +% the description in Section~\ref{commands} +% +% What I did was to define a \MP{} input for the swelled rule, to +% assign it a name and to use it when needed. For example, the above +% verbatim environment surrounded by swelled rules has been written as +% in Figure~\ref{averb}. +% +% \begin{figure} +% \centering\catcode`!=\active \def!{} +% \begin{minipage}{.5\linewidth} +%\begin{verbatim} +%\begin{center} +%\usempost{swelled}\\*[3ex] +%\begin{minipage}{.5\linewidth} +%\begin!{verbatim} +%\begin{mpost}[name=swelled] +%breadth=.667\mpdim{\linewidth}; +%... +%\end{mpost} +%\end!{verbatim} +%\end{minipage}\\*[3ex] +%\usempost{swelled} +%\end{center} +%\end{verbatim} +% \end{minipage} +% \caption{The input for the nice verbatim}\label{averb} +% \end{figure} +% +% A recent message on \texttt{comp.text.tex}\footnote{\messageurl} +% asked how to realize in \LaTeX{} chapter headers like the ones in +% the manual ``Con\TeX{}t, an +% excursion''\footnote{\texttt{http://www.pragma-ade.nl/general/manuals/mp-cb-en.pdf}} +% and Taco Hoekwater kindly provided the code that's used. Here I +% propose a macro that solves the problem, once it's integrated in a +% chapter style for \textsf{memoir} or \textsf{titlesec}; the \MP{} +% code is found in table~\ref{taco} and the result is shown here +% \begin{center} +% \bigskip +% \tacochapterhead{How to draw graphics} +% \bigskip +% \end{center} +% Now you can return to the first page and see that the title for the +% introduction was typeset inside a similar drawing, but of different +% size. The \MP{} code is exactly the same as Taco's, except for the +% call of \texttt{mpost} instead of \cmdname{startMPgraphic} and +% \cmdname{endMPgraphic}. The \LaTeX{} code used is +%\begin{verbatim} +%\newsavebox{\tacochapterbox} +%\newcommand{\tacochapterhead}[1]{% +% \sbox\tacochapterbox{\Large\bfseries #1}% +% {\ooalign{% +% \MPclipOne{\mpdim{\wd\tacochapterbox+6pc}} % width +% {\mpdim{\ht\tacochapterbox+3pc}} % height +% {8} % thickness of the curve +% {(.7,.7,.7)} % color of the curve +% {red} % color of the spots +% \cr\hfill\raisebox{\dimexpr.5\ht\tacochapterbox+1.5pc\relax} +% {\box\tacochapterbox}\hfill}}} +% +%\tacochapterhead{How to draw graphics} +%\end{verbatim} +% Use a high level package such as \textsf{titlesec} in order to draw +% fancy ornaments around the chapter title; an example might be +%\begin{verbatim} +%\newcommand{\chapformat}[1]{\tacochapterhead{\thechapter.\ #1}} +%\titleformat{name=\chapter}[block] +% {\large\bfseries\filcenter}{}{0pt}{\chapformat} +%\titleformat{name=\chapter,numberless}[block] +% {\large\bfseries\filcenter}{}{0pt}{\tacochapterhead} +%\end{verbatim} +% which takes care also of numberless chapter headings. +% +% \begin{table} +% \caption{\MP{} code for a fancy chapter heading}\label{taco} +%\begin{verbatim} +%%macro arguments: +%%#1 = desired width +%%#2 = desired height +%%#3 = pen thickness (relative) +%%#4 = line color +%%#5 = dot color +%\def\MPclipOne#1#2#3#4#5% +% {\begin{mpost} +% w := #1; width := 100; wfactor := w/width; +% h := #2; height := 100; hfactor := h/height; +% color lightred; lightred := (.90,.50,.50); +% color lightgray; lightgray := (.95,.95,.95); +% color gray; gray := (.50,.50,.50); +% def random_delta (expr d) = +% d-(uniformdeviate 2d) +% enddef; +% z1 = (0,height); +% z2 = (0,0); +% z3 = (width,0); +% z4 = (width,height); +% z5 = (width+random_delta(.2width),height+random_delta(.2height)); +% z6 = (.5width+random_delta(.1width),height+random_delta(.1height)); +% pickup pencircle +% xscaled (#3/wfactor) +% yscaled (#3/(2*hfactor)) +% rotated 30; +% draw z5..z1..z2..z3..z4..z6 withcolor #4; +% pickup pencircle +% xscaled (#3/wfactor) +% yscaled (#3/hfactor); +% draw z1 withcolor #5; +% draw z2 withcolor #5; +% draw z3 withcolor #5; +% draw z4 withcolor #5; +% draw z5 withcolor #5; +% draw z6 withcolor #5; +% newwidth := (xpart (urcorner currentpicture)) - +% (xpart (llcorner currentpicture)); +% newheight := (ypart (urcorner currentpicture)) - +% (ypart (llcorner currentpicture)); +% currentpicture := currentpicture +% xscaled (w/newwidth) yscaled (h/newheight); +% \end{mpost}} +%\end{verbatim} +% \end{table} +% +% Another useless application comes from the Metafun manual, by Hans +% Hagen~\cite{hagen-metafun}: a representation of a counter using +% vertical bars with a diagonal one after four of them, just like when +% counting on a piece of scratch paper. We can borrow the \MP{} input +% from Hans, and define the command you find in table~\ref{scratch}. +% +% \begin{table} +% \caption{The \texttt{\string\scratchcount} macro}\label{scratch} +%\begin{verbatim} +%\newcommand{\scratchcount}[1]{% +% \begin{mpost} +% n:=#1; +% height := 3/5\mpdim{\baselineskip} ; +% span := 1/3 * height ; +% drift := 1/10 * height ; +% pickup pencircle scaled (1/12 * height) ; +% def d = (uniformdeviate drift) enddef ; +% for i := 1 upto n : +% draw +% if (i mod 5)=0 : ((-d-4.5span,d)--(+d-0.5span,height-d)) +% else : ((-d,+d)--(+d,height-d)) fi +% shifted (span*i,d-drift) ; +% endfor; +% picture cp ; +% cp := currentpicture ; %for readability +% setbounds currentpicture to +% (llcorner cp shifted (0,-ypart llcorner cp) -- +% lrcorner cp shifted (0,-ypart lrcorner cp) -- +% urcorner cp -- ulcorner cp -- cycle) ; +% \end{mpost}} +%\makeatletter +%\newenvironment{scratchenum}{\begin{enumerate} +% \@namedef{label\@enumctr}{\scratchcount{\arabic{\@enumctr}}}% +% }{\end{enumerate}} +%\makeatother +%\end{verbatim} +% \end{table} +% +% Now we have a new environment and we can use it at every nesting +% level: +% \begin{enumerate} +% \item A first item, to remember that \MP{} is a big fun, for the +% following reasons: +% \begin{scratchenum} +% \item it has a syntax very similar to \MF; +% \item it outputs very good PostScript; +% \item there are many people using it; +% \item it is very simple to use; +% \item it integrates easily with \LaTeX; +% \item some other reason just to arrive to six. +% \end{scratchenum} +% \item A second item, to remember that \LaTeX{} users can benefit from +% the use of \MP{}. +% \end{enumerate} +% The input for this nested enumeration was +%\begin{verbatim} +%\begin{enumerate} +% \item A first ... +% \begin{scratchenum} +% \item it has ... +% ... +% \end{scratchenum} +% \item A second ... +%\end{enumerate} +%\end{verbatim} +% +% Of course, if we need to use the \texttt{scratchenum} only at the +% first level of nesting, a definition such as +%\begin{verbatim} +%\newenvironment{scratchenum} +% {\begin{enumerate} +% \renewcommand{labelenumi}{\scratchcount{\arabic{enumi}}}% +% } +% {\end{enumerate}} +%\end{verbatim} +% would have sufficed. We give as argument to \cmdname{scratchcount} +% the representation of the counter as an arabic number; \MP{} does +% all the necessary calculations. +% +% \begin{figure} +% \centering +%\begin{verbatim} +%\newcommand\lista[2][black]{% +%\VCEN{\begin{mpost}[mpmem=metafun] +%n:=#2 ; color fuzzy_color ; fuzzy_color:=#1 ; +% +%height := 5pt ; +%span := 1/3 * height ; +%drift := 1/10 * height ; +%hsize := .7\mpdim{\linewidth} ; +%vstep := 10pt ; +%xmax := hsize div 5span ; +% +%pickup pencircle scaled (1/12 * height) ; +%def d = (uniformdeviate drift) enddef ; +%for i := 1 upto n : +% xpos := ((i-1) mod (5*xmax))*span ; +% ypos := ((i-1) div (5*xmax))*vstep ; +% draw +% if (i mod 5)=0 : ((-d-4.5span,d)--(+d-0.5span,height-d)) +% else : ((-d,+d)--(+d,height-d)) fi +% shifted (xpos,-ypos+d-drift) withcolor fuzzy_color ; +%endfor; +% +%picture cp ; +%cp := currentpicture ; % for readability +%if (ypart ulcorner cp - ypart llcorner cp) <= vstep : +%setbounds currentpicture to +% (llcorner cp shifted (0,-ypart llcorner cp) -- +% lrcorner cp shifted (0,-ypart lrcorner cp) -- +% urcorner cp -- ulcorner cp -- cycle) ; +%fi +%\end{mpost}}} +%\end{verbatim} +% \caption{Expanded definition for the scratch numbers; the +% \protect\cmdname{VCEN} macro is for centering the object.}\label{expan} +% \end{figure} +% +% We can expand on this theme, to represent greater numbers. You can +% see it in Figure~\ref{expan}. After this, an input like +%\begin{verbatim} +%\begin{tabular}{llr} +%\multicolumn{2}{c}{\textbf{La lista}}\\\hline\\ +%Italia & \lista[red]{640} & 640\\\\ +%Alemagna & \lista{231} & 231\\\\ +%Francia & \lista[red]{100}& 100\\\\ +%Turchia & \lista{91}& 91\\\\ +%Spagna & \lista[red]{1003} & 1003\\\\\hline +%\end{tabular} +%\end{verbatim} +% gives what you can see in figure~\ref{lalista}, but if we put it +% inside a \texttt{minipage}, we can render the same list in other +% ways, automatically. You see it in Figure~\ref{liste}. +% +% \begin{figure} +% \caption{La lista}\label{lalista} +% \centering +% \medskip +% \begin{tabular}{llr} +% Italia & \lista[red]{640} & 640\\\\ +% Alemagna & \lista{231} & 231\\\\ +% Francia & \lista[red]{100}& 100\\\\ +% Turchia & \lista{91}& 91\\\\ +% Spagna & \lista[red]{1003} & 1003\\ +% \end{tabular} +% +% \medskip +% \end{figure} +% +% \begin{figure} +% \centering +% \scalebox{.7}{% +% \begin{minipage}{.5\linewidth} +% \begin{tabular}{ll} +% \multicolumn{2}{c}{\textbf{La lista}}\\\hline\\ +% IT & \lista[red]{640}\\\\ +% DE & \lista{231}\\\\ +% FR & \lista[red]{100}\\\\ +% TR & \lista{91}\\\\ +% ES & \lista[red]{1003}\\\\\hline +% \end{tabular} +% \end{minipage} +% \quad +% \begin{minipage}{.4\linewidth} +% \begin{tabular}{ll} +% \multicolumn{2}{c}{\textbf{La lista}}\\\hline\\ +% IT & \lista[red]{640}\\\\ +% DE & \lista{231}\\\\ +% FR & \lista[red]{100}\\\\ +% TR & \lista{91}\\\\ +% ES & \lista[red]{1003}\\\\\hline +% \end{tabular} +% \end{minipage}} +% \caption[]{The tables have been reduced at 70\%. On the right the +% table has been put in a \texttt{minipage} +% of size \texttt{.5\cmdname{linewidth}}; on the left the size was +% \texttt{.4\cmdname{linewidth}}}\label{liste} +% \end{figure} +% +% Note how we can pass to the \MP{} input some parameters, a +% dimension as before, and a color specification. +% +% It is not necessary to put \texttt{mpost} environments inside a +% definition, as we have already seen. We can assign a name to the +% object and use it as many times as we like, even subject to +% transformations with the same syntax as \cmdname{includegraphics}. The +% following example is from the \MP{} package \textsf{drv}, which +% requires a double run of \MP{}: +%\begin{verbatim} +%\begin{mpost}[runs=2,mpsettings={input drv;},name=der1] +%jgm 0 "A\vdash B"; +%jgm 1 "B\vdash C"; +%jgm 2 "A\vdash C"; +%nfr 0 () ("f", 1); +%nfr 1 () ("g", 1); +%nfr 2 (0, 1) ("\circ", 1); +%draw drv_tree; +%\end{mpost} +%\usempost{der1}\quad +%\usempost[angle=90]{der1} +%\end{verbatim} +% \begin{center} +% \begin{mpost}[runs=2,mpxprogram=latex, +% mpsettings={input drv;},name=der1,use] +% jgm 0 "A\vdash B"; +% jgm 1 "B\vdash C"; +% jgm 2 "A\vdash C"; +% nfr 0 () ("f", 1); +% nfr 1 () ("g", 1); +% nfr 2 (0, 1) ("\circ", 1); +% draw drv_tree; +% \end{mpost}\quad +% \usempost[angle=90]{der1} +% \end{center} +% +% If a \MP{} object is not assigned a name it is immediately used and, +% obviously, it cannot be used any more. Well, this is not strictly +% true: every object has a number corresponding to an \textsc{mps} file +% named \meta{filename}\texttt{+mp}\meta{number}\texttt{.mps} and it +% would be possible to include it in the usual way. Here +% \meta{filename} is the name of the root \LaTeX{} file. However, the +% \meta{number} is not fixed, since insertion of other objects before a +% certain one will change its assigned number. +% +% There are three ways for typesetting a document using \textsf{gmp}, +% which correspond to the following package options: +% \begin{description} +% \item[\texttt{shellescape}] exploits the `shell escape' feature +% present in most \TeX{} distributions: every \texttt{mpost} environment +% calls a run of \MP{}, setting the object immediately (you have to call +% the typesetting engine with the necessary command line option, see +% later); +% +% \item[\texttt{noshellescape}] defers the \MP{} runs to the end of +% the \LaTeX{} run, the user has to launch them by hand---in this case a +% very simple shell script is written for doing all the business; +% +% \item[\texttt{nowrite}] inhibits writing \MP{} files and disables +% running \MP{}: when the document is finished and no more modifications +% to the \MP{} objects are needed, we can set this option and read the +% \textsc{mps} files already compiled in previous runs. +% \end{description} +% +% The `shell escape' feature is very handy, but someone may feel uneasy +% with it. For security reasons, \TeX{} distributions usually disable +% it by default and it must be explicitly requested by calling +% \begin{flushleft} +% \texttt{latex -shell-escape} \meta{filename}\\ +% \texttt{pdflatex -shell-escape} \meta{filename}\\ +% \texttt{xelatex -shell-escape} \meta{filename} +% \end{flushleft} +% depending on what engine you are using; see your system's +% documentation for the actual call: for \TeX~Live the command line +% option \texttt{-shell-escape}, while for MiK\TeX{} it's +% \texttt{-enable-write18}. +% +% In case some \MP{} graphics doesn't compile properly, it's better to +% switch to \texttt{noshellescape} and launch the shell script after a +% new \LaTeX{} run: from a terminal window say +% \texttt{sh~\meta{filename}+mp.sh}, where \meta{filename} stands for +% your main document's name. This will run \MP{} in `error stop mode', +% so that you'll probably get a clue about what is going wrong. +% +% If one uses \XeLaTeX{}, all \textsc{mps} files will be converted to +% \textsc{pdf} via \texttt{epstopdf}. +% +% +% \section{The name of the package and its workings} +% +% I wanted a successor of \textsf{emp}, but \textsf{fmp} was out of the +% question: this is a package for including functional \MP{} in +% \LaTeX. So I chose \textsf{gmp}. +% +% Here is a brief description of how the package works. A \MP{} +% object is defined through a \texttt{mpost} environment +% (see~Section~\ref{envoptions}). When such an environment is found, +% an external \MP{} file is written and processed (either immediately +% or after the \LaTeX{} run, at the user's choice). After processing, +% a file called \meta{filename}\texttt{+mp}\meta{number}\texttt{.mps} +% is produced, which is then included in the \LaTeX{} output with +% \cmdname{includegraphics}, but without user's intervention. If the +% object is assigned a name, it can be included as many times as +% desired. +% +% The \textsf{gmp} package depends on \textsf{xkeyval}, +% \textsf{ifxetex}, \textsf{ifpdf} and, of course, +% \textsf{graphicx}. If you have to pass options to this one, load it +% before \textsf{gmp}. +% +% +% \section{File names} +% +% This package \emph{doesn't} support file names containing +% spaces. Quoting D.~E.~Knuth, if you're upset about this, you shouldn't +% be: spaces in file names might be supported, but every system has its +% idiosyncrasies and quotes around the name aren't always the correct +% answer. Avoiding strange characters in file names is the best strategy +% for being compatible with most platforms. +% +% +% \section{To do} +% +% Find out a way to coerce creation of all auxiliary files in a +% subdirectory of the current directory, in order not to fill it with +% junk, besides what's really necessary. +% +% +% \section{The package options}\label{options} +% +% We have seen some of the package options, but now I will present them +% more formally. Some of them will be grouped together; the first one +% of the group is the default. +% +% \subsection{\texttt{tex} and \texttt{latex}} +% +% \MP{} is able to use either Plain \TeX{} or \LaTeX{} for typesetting +% the `labels'. If you are using ten point type and the usual Computer +% Modern fonts or no label at all, it is not necessary to set this +% option (the default is \texttt{tex}). On the other hand, if you are +% using different fonts or different type sizes, then \texttt{latex} is +% necessary. The package creates a crude preamble keeping the type size +% of your document; insertion of any other package or of a different +% class must be explicitly done with the commands \cmdname{usempxclass} +% and \cmdname{usempxpackage} which have the same syntax as +% \cmdname{documentclass} and \cmdname{usepackage}. See +% Section~\ref{commands} for a description of the commands; their names +% should remember that they are used for an `extension' of \MP{}, namely +% the preprocessor that typesets the labels making them into \MP{} +% pictures. However the option can be overridden for any picture, see +% later on. +% +% \subsection{\texttt{noshellescape} and \texttt{shellescape}} +% +% The \texttt{shellescape} option uses the \verb|\write18| feature found +% in many \TeX{} distributions (all the up-to-date ones based on +% \textsf{Web2C} such as \TeX~Live, and MiK\TeX{}). Its purpose is to +% stop momentarily the \TeX{} compilation for executing the \MP{} run +% after a \texttt{mpost} environment has been found. \LaTeX{} or +% \textsc{pdf}\LaTeX{} have to be called with the \texttt{-shell-escape} +% command line option or \texttt{-enable-write18} on MiK\TeX. +% +% With \texttt{noshellescape} all shell commands are collected in a +% batch file and \LaTeX{} will remember users to execute it at the end +% of the run. On the subsequent \LaTeX{} run, all objects should be in +% place. +% +% When a compiled \MP{} object is not found at the proper place, a box +% like the one in the% +% \marginpar[\hfill\csname gmp@box\endcsname]{\csname gmp@box\endcsname}% +% margin is printed. The same will happen in presence of compilation +% errors, precisely when the proper \textsc{mps} file is not found. +% +% When using the \texttt{noshellescape} option, it may happen that +% after a compilation the objects are misplaced, for example if some +% new object has been added; running \MP{} on the created files and +% another \LaTeX{} run should fix this. The default option is +% \texttt{noshellescape}. +% +% +% \subsection{\texttt{write} and \texttt{nowrite}} +% +% The \texttt{nowrite} option is useful when all \MP{} objects are +% present in the document, they are in their final form and all of +% them have been processed. By setting the \texttt{nowrite} option, +% no writing of \MP{} files and no compilation take place, speeding up +% the process. I would have called this option \texttt{final} and its +% contrary \texttt{draft}, but this usage conflicts with the workings +% of \textsf{graphicx}. The default option is \texttt{write}, so it's +% not necessary to specify it. +% +% +% \subsection{\texttt{envname}} +% +% You can change the name of the environment for the \MP{} objects; +% the default is \texttt{mpost}. If you don't like it or you want this +% name for your favorite environment, you can say +% \begin{flushleft} +% \texttt{envname=}\meta{string} +% \end{flushleft} +% and \meta{string} will be used for introducing \MP{} objects. This +% key must be specified only as a package option, not in the argument +% of \cmdname{gmpoptions}.\footnote{Actually it can be in +% \cmdname{gmpoptions}, but there it has no effect.} +% +% +% \subsection{\texttt{extension}} +% +% If the root \LaTeX{} file is called \texttt{file}, then the compiled +% \textsc{mps} files will be named +% \texttt{file+mp}\meta{number}\texttt{.mps}. The string \texttt{+mp} is +% the \emph{mp-extension}, which can be modified by saying +% \begin{flushleft} +% \texttt{extension=}\meta{string} +% \end{flushleft} +% in the options to \textsf{gmp}; the \meta{string} should consist only +% of printable ASCII characters with no special meaning to \TeX{}. So, +% with a main file called \texttt{paper.tex}, the created files will be +% named \texttt{paper+mp0001.mp} and so on; with +%\begin{verbatim} +%\gmpoptions{extension=--mp--} +%\end{verbatim} +% the names will be \texttt{paper--mp--0001.mp} and so on. \emph{Don't +% use a slash} in the mp-extension! Leave this option to the default +% value, unless you happen to have files whose name contains the string +% \texttt{+mp}. +% +% +% \subsection{\texttt{everymp}} +% +% Here you can set whatever you want to be present in all \MP{} +% objects, for example input files. Any set of \MP{} statements +% can be given in braces, for example +%\begin{verbatim} +%everymp={input boxes;} +%\end{verbatim} +% Since these are \MP{} statements, don't forget the trailing +% semicolon. If you have a long list of \MP{} macros that should be +% loaded for each picture, it's better to save them in a file and input +% this one with the \texttt{everymp} key. When your document uses font +% packages, you may need to say +%\begin{verbatim} +%everymp={prologues=3;} +%\end{verbatim} +% so that your \textsc{mps} files will contain correct references to +% the fonts; this is automatically done when the typesetting engine is +% \XeLaTeX{}. +% +% \subsection{\texttt{clean=none\string|aux\string|mp}} +% +% After the compilation, there will be many auxiliary files around. The +% essential ones are only those necessary for the picture inclusion, +% namely the \textsc{mps} or \textsc{pdf} final results. With +% \texttt{clean=none} nothing will be removed, with \texttt{clean=aux} +% the files with extension \texttt{.log}, \texttt{.mpx} and +% \texttt{.mpo} created during the \MP{} runs will be deleted. Also the +% \texttt{.mp} files will be deleted with \texttt{clean=mp}; this option +% will erase also the \texttt{.mps} files when \XeLaTeX{} is used. +% +% Some strange files will remain, particularly when there's some error +% during one of the \MP{} runs; this is why I chose not to delete them. +% It's best to use \texttt{clean=none}, which is the default, at the +% beginning, changing to \texttt{clean=aux} when everything seems to be +% alright and \texttt{clean=mp} for the last check before setting +% \texttt{nowrite}. +% +% In case you are worried about what files will be deleted, run with the +% \texttt{noshellescape} options and have a look at the shell script +% that's created: it will show at its end the remove commands that will +% be run. Or just don't set anything, so that \texttt{clean=none} will +% be in force. +% +% +% \subsection{\texttt{rmcommand}} +% +% The default command for cleaning the directory is \texttt{rm~-f}. Of +% course this is system dependent and those on +% Windows$^{\scriptscriptstyle\mathrm{TM}}$ systems might want to set +% \texttt{rmcommand=del}. +% +% \subsection{\texttt{postrmcommand}} +% The value of the key \texttt{postrmcommand} is usually empty; you can +% obtain a `safe removing' by setting something like +%\begin{verbatim} +%\gmpoptions{rmcommand=mv,postrmcommand=junk} +%\end{verbatim} +% This will be translated into commands such as +%\begin{verbatim} +%mv filename+mp*.log junk +%\end{verbatim} +% so if you have a subdirectory called \texttt{junk} all the auxiliary +% files will be moved into it, instead of being deleted. +% +% +% \section{Commands}\label{commands} +% +% +% \subsection{\cmdname{gmpoptions}\marg{\meta{options}}} +% +% All package options can be given either as an optional argument to +% \cmdname{usepackage} or as an argument to \cmdname{gmpoptions}. This +% command can be given multiple times, with cumulative effect, but only +% in the preamble. However the \texttt{envname} option has no effect +% here. +% +% +% \subsection{\cmdname{usempxclass}% +% \oarg{\meta{options}}% +% \marg{\meta{class}}} +% +% This has the same syntax as \cmdname{documentclass}. Its purpose is +% to declare the class used for the runs of \TeX{} or \LaTeX{} for +% preparing the \texttt{mpx} files which \MP{} needs to draw the text +% labels. It should be not necessary to change it from the default +% (which is \texttt{article}). But if you are using a non standard +% class with a non standard type size (i.e., not 10, 11 or 12 point +% size), then you \emph{will need} to declare a class, otherwise your +% labels will be typeset in 10~point type. Of course this has no effect +% for \MP{} objects where the \TeX{} format to be used is Plain~\TeX{}. +% +% +% \subsection{\cmdname{usempxpackage}% +% \oarg{\meta{options}}% +% \marg{\meta{package\textup(s\textup)}}} +% +% Same syntax as \cmdname{usepackage}. It can be given multiple times +% and its effects are cumulative. Thus, if your main text font is +% Palatino, you have to give +%\begin{verbatim} +%\usepackage{palatino} +%\usempxpackage{palatino} +%\end{verbatim} +% I chose not to modify the standard \cmdname{usepackage} command +% because some packages make no sense inside \MP{} objects and it +% would be useless and time consuming to load them. Just think to the +% \textsf{pgf} package, for example: while a user may very well employ +% this one alongside with \textsf{gmp}, it would be very questionable to +% load \textsf{pgf} during a \LaTeX{} run to compile a \MP{} graphic +% object, albeit not forbidden. +% +% If your labels in \MP{} pictures use special characters (the accented +% ones, for instance), you \emph{must} load the \textsf{inputenc} package +% \emph{with the same option} as your main file: +%\begin{verbatim} +%... +%\usepackage[latin1]{inputenc} +%... +%\usepackage{gmp} +%\gmpoptions{...} +%\usempxpackage[latin1]{inputenc} +%... +%\end{verbatim} +% You can use any encoding with (\textsc{pdf})\LaTeX{}; set the +% \texttt{utf8} or \texttt{utf8x} option when your main document is +% typeset with \XeLaTeX{}. +% +% Both \cmdname{usempxpackage} and \cmdname{usempxclass} respect the +% usual scoping rules, so you can modify the class or the packages used +% for a particular \MP{} object by enclosing the commands in a group, +% for example in an environment such as \texttt{figure}. But no, not in +% the \texttt{mpost} environment itself, sorry. +% +% +% \subsection{\cmdname{resetmpxpackages}} +% +% This command resets to empty the list of packages to be loaded, +% obeying to the normal scoping rules. +% +% +% \subsection{\cmdname{mpxcommands}\marg{\meta{commands}}} +% +% With this command you can add \LaTeX{} commands to be executed for +% every run of \MP{}, when typesetting labels; for instance, your +% favorite definitions. Also the effect of this command is cumulative. +% Pay attention that this works only if the program used for compiling +% the \texttt{mpost} figures is \LaTeX{}. Like the commands for +% choosing the class and the packages, this one obeys the scoping rules. +% +% \subsection{\cmdname{resetmpxcommands}} +% +% This command resets the list of commands to empty, obeying to the +% normal scoping rules. +% +% +% \subsection{\cmdname{mpdim}\marg{\meta{dimen parameter}}} +% +% This command takes as argument a length, i.e., a \LaTeX{} parameter or +% a command defined by \cmdname{newlength} or operations on lengths. +% Its output is the length in points; if the length is a rubber one, the +% `plus' and `minus' parts are ignored. You can even use as argument an +% explicit length such as `\texttt{2cm}', although this would be +% overkill. However, you can give as argument some calculation with +% \cmdname{dimexpr} syntax, such as +%\begin{verbatim} +%\mpdim{2ex+\baselineskip} +%\mpdim{3em-1pt} +%\end{verbatim} +% which might be useful, because the \texttt{ex} and \texttt{em} units +% change with the current font size. Don't add \cmdname{relax}, it's +% automatically provided. +% +% \begin{annotation} +% \TeX{}nical note. The command \cmdname{mpdim} works without making +% assignments, so that it is fully expandable at the moment of the +% \cmdname{write} to the \MP{} external file. It uses internally +% \cmdname{the} and \cmdname{dimexpr}. When the \cmdname{write} takes +% place, the command is expanded and the output is +% \begin{flushleft} +% \ttfamily +% begingroup \meta{thedimen} endgroup +% \end{flushleft} +% where \meta{thedimen} is the value of the \meta{dimen} given as +% argument. Therefore the construction +% \cmdname{mpdim}\marg{\meta{dimen}} behaves like a number as far as +% \MP{} is concerned; for Metapost, dimensions are simply numbers and +% the units are just multipliers. +% \end{annotation} +% +% +% \subsection{\cmdname{usempost}} +% +% This command takes as its argument a string already assigned as a name +% to a \MP{} object. Its effect is to place the graphic object where +% the command appears. The complete syntax is +% \begin{flushleft} +% \cmdname{usempost}\oarg{\meta{options}}\marg{\meta{string}} +% \end{flushleft} +% where \meta{string} is the name of an already introduced and named +% \MP{} object and \meta{options} are any options that make sense for +% the \cmdname{includegraphics} command provided by the +% \textsf{graphicx} package. +% +% +% \section{Environments} +% +% The package provides two environments, whose default names are +% \texttt{mpost} and \texttt{mpost*}. The name, however, can be changed +% in the package options, as we have already seen. In the descriptions +% below I'll use the default name. +% +% Commands in the body of the \texttt{mpost} environment \emph{are} +% interpreted and expanded and this is the main feature offered by this +% package. +% +% The main difference between \texttt{mpost} and \texttt{mpost*} is that +% in the second one there is no expansion at all: every \MP{} statement +% in the environment's body is written out as it is for subsequent +% processing. Therefore \texttt{mpost*} behaves like \texttt{emp} or +% \texttt{mpgraphics} of the respective packages, but the difference is +% that it \emph{can} go in the argument to a command. This behavior +% costs us something: \LaTeX{} environments in \MP{} labels \emph{must} +% be enclosed in a pair of braces in the same \texttt{btex...etex} +% construction. So don't say +% \begin{flushleft}\color{red} +%\begin{verbatim} +%btex ... $\begin{array}{c}a\\b\end{array}$ ... etex +%\end{verbatim} +% \end{flushleft} +% but rather +%\begin{verbatim} +%btex ... {$\begin{array}{c}a\\b\end{array}$} ... etex +%\end{verbatim} +% See later on for details. The same holds for the \texttt{mpost} +% environment, with one more little catch, see page~\pageref{btex}. +% +% There is no |\inputmpost| command: if you really need it, just +% define +%\begin{verbatim} +%\newcommand{\inputmpost}[2][1]{\begin{mpost}[#1]input #2;\end{mpost}} +%\end{verbatim} +% The \MP{} file you input this way should contain just statements +% that would go in a normal \texttt{mpost} environment. +% +% +% \section{Options to the environments}\label{envoptions} +% +% Actually, the name of the two environments provided by this package +% can be chosen by the user on a per document basis with the package +% option \texttt{envname}. I will use the default name in the +% description. The syntax is +% \begin{flushleft} +% \cmdname{begin}\marg{mpost}\oarg{\meta{options}}\\ +% \meta{\MP{} statements}\\ +% \cmdname{end}\marg{mpost}\\[3ex] +% \verb|\begin{mpost*}[|\meta{options}\verb|]|\\ +% \meta{\MP{} statements}\\ +% \verb|\end{mpost*}| +% \end{flushleft} +% +% The \meta{options} are in the form \meta{key}\texttt{=}\meta{value}. +% They influence only the current environment and are the same for the +% two varieties (\texttt{mpost} and \texttt{mpost*}). +% +% +% \subsection{\texttt{name}} +% +% With \texttt{name=}\meta{string} you assign the object a name for +% subsequent multiple use with \cmdname{usempost}\marg{\meta{string}}. +% For example, if the object is some symbol to be employed many times, +% you can say +%\begin{verbatim} +%\begin{mpost}[name=mysymbol] +%... +%\end{mpost} +%\newcommand{\mynicesymbol}{% +% \usempost[height=.7\ht\strutbox]{mysymbol}} +%\end{verbatim} +% In this case you cannot pass arguments to the \texttt{mpost} +% environment: the object is \emph{frozen} apart from modifications with +% the optional argument to \cmdname{usempost}. In this case the symbol +% we have built with \MP{} will change size according to the current +% font size, but only by scaling. +% +% The \meta{string} used as a name should consist only of ASCII +% printable characters; no accented letters, please, just like for +% \LaTeX{} labels (those for \cmdname{label}). If you specify this key, +% then the object will not appear unless you specify also \texttt{use}, +% see below. The proper place for named environments is usually the +% preamble. +% +% \begin{annotation} +% Suppose you have to write the symbol for a square wave in different +% sizes; instead of using only one \textsc{mps} graphic file and scaling +% it you may want to define a couple of them. Say, for instance, that +% you need it also in section titles, which are typeset in +% \cmdname{Large} size and bold face and that the symbol's height is the +% same as a lowercase letter. You can get the two versions which are +% automatically chosen among with the following code: +%\begin{verbatim} +%\makeatletter +%\newcommand{\sqwave}{\usempost{sqwave\f@size\f@series}} +%\newcommand{\sqwavebody}{% +% u:=\mpdim{1ex}; +% pickup pencircle scaled \mpdim{.05em}; +% draw (0,0)--(2/3u,0)--(2/3u,u)--(u,u)--(u,0)--(5/3u,0);} +%{\normalsize +%\begin{mpost}[name=sqwave\f@size\f@series]\sqwavebody\end{mpost} +%} +%{\Large\bfseries +%\begin{mpost}[name=sqwave\f@size\f@series]\sqwavebody\end{mpost} +%} +%\makeatother +%\end{verbatim} +% Then simply say \cmdname{sqwave} when you need the symbol. If you +% change the type size of your document, you'll get the proper symbol's +% height. If it turns out that you need the symbol also in other +% contexts, just add other \texttt{mpost} named environments along the +% same lines. +% +% We pass the \texttt{mpost} environment two dimensions that depends on +% the context: the symbol's height will be the x-height of the current +% font, the pen's width will scale according to the em size, which is +% bigger for bold face fonts. The picture will be chosen according to +% the current value of \cmdname{f@size} (the current type size) and +% \cmdname{f@series}, which contains the font series indicator (`m' for +% medium fonts and `bx' for bold face fonts, usually). The auxiliary +% macro \cmdname{sqwavebody} contains the body of the \texttt{mpost} +% environment, so there's even no need to copy it many times. +% \end{annotation} +% +% +% \subsection{\texttt{use}} +% This is a boolean option, the default is \texttt{true} unless the +% \texttt{name} option is present. When it is set to \texttt{true}, +% the object is inserted in the place where the environment appears. In +% order to set it to \texttt{true}, it is sufficient to say \texttt{use} +% instead of \texttt{use=true}. +% +% \subsection{\texttt{mpmem}} +% You can choose a different format for \MP{} compilation instead of +% the default Plain. For example you can use Hans Hagen's Metafun +% package by passing the option +% \begin{flushleft} +% \texttt{mpmem=metafun} +% \end{flushleft} +% +% \subsection{\texttt{mpxprogram}} +% +% With this option, you can override the global option chosen when +% \textsf{gmp} was loaded, or with \cmdname{gmpoptions}; with +% \texttt{mpxprogram=tex} you invoke Plain \TeX{}, with +% \texttt{mpxprogram=latex} you invoke \LaTeX{} with the preamble +% defined by default or in the options to \textsf{gmp}. There are +% presently no other choices. Use \texttt{mpxprogram=latex} (or set the +% package option \texttt{latex}) whenever you have \MP{} labels. +% +% +% \subsection{\texttt{mpxcommands}} +% +% You can pass some commands to be executed when compiling \MP{} with +% \LaTeX{} with \texttt{mpxcommands=}\meta{commands}. For instance, you +% can say +%\begin{verbatim} +%mpxcommands={\newcommand{\C}{\mathbf{C}}} +%\end{verbatim} +% if your labels contain a \cmdname{C} command for typesetting the set +% of complex numbers in bold face type or some other useful commands. +% You may also say +%\begin{verbatim} +%mpxcommands={\input{mymacros}} +%\end{verbatim} +% and put all needed definitions inside \texttt{mymacros.tex}. Remember +% that inside \verb|\btex...etex| constructions (see +% Section~\ref{body}), \MP{} does \emph{not} know any of your personal +% commands, since the typesetting is made during a distinct run of +% \LaTeX{}. The \LaTeX{} commands are not interpreted during the write +% to the auxiliary file, they will be during \MP{} compilation. +% +% \subsection{\texttt{mpsettings}} +% +% The value for this key is a list of \MP{} statements to be executed +% \emph{before} \texttt{beginfig}, usually for inputting \MP{} +% packages. For example, if a \MP{} object is drawn with the +% \textsf{boxes} package, then it is necessary to say +%\begin{verbatim} +%mpsettings={input boxes;} +%\end{verbatim} +% because this package must be loaded before saying \texttt{beginfig}. +% Of course such a statement can be included also with the +% \texttt{everymp} global key. Don't forget the trailing semicolon. +% \LaTeX{} commands are interpreted just as in the \texttt{mpost} +% environment, so it's possible to use, for example, \cmdname{mpdim}. +% +% \subsection{\texttt{runs}} +% +% The \textsf{drv} package for \MP{} requires each source file to be +% run twice; in this case set the option \texttt{runs=2}. For this +% specific package it's necessary to use also the \texttt{latex} +% option and also, of course, \texttt{mpsettings={input drv;}} in +% order to load the \MP{} package. The default value is~$1$. +% +% +% \section{The body of the \texttt{mpost} and \texttt{mpost*} +% environments}\label{body} +% +% The body of the \texttt{mpost} and \texttt{mpost*} environments +% consists of \MP{} statements with the exception of +% \texttt{beginfig(\meta{number});}, \texttt{endfig;} and +% \texttt{end}\footnote{Actually, you \emph{can} put such statements; +% but don't blame me if your computer starts choking or insulting +% you.}. +% +% The \MP{} input that will be processed consists of +% \begin{flushleft} +% \meta{\TeX{} preamble}\\ +% \meta{\MP{} preamble}\\ +% \texttt{beginfig(\meta{number});}\\ +% \meta{body of the environment}\\ +% \texttt{endfig;end}\\ +% \meta{\TeX{} postamble} +% \end{flushleft} +% The \meta{body of the environment} is precisely the contents of the +% \texttt{mpost} environment you supply. The \meta{number} is assigned +% automatically and is actually irrelevant. +% +% The \meta{\TeX{} preamble} is empty if the compiler for the +% \texttt{mpx} files is \TeX{}; it is the \LaTeX{} preamble formed as +% seen before in case the compiler is \LaTeX{}. In the latter case, the +% \meta{\TeX{} postamble} is just +%\begin{verbatim} +%verbatimtex \end{document} etex +%\end{verbatim} +% otherwise it is empty (the \MP{} interpreter knows to add +% \verb|\end| at the end of its produced \texttt{mpx} file, if +% necessary). Of course the \meta{\TeX{} preamble} is complemented by +% the declarations you supply with the previously described commands. +% Similarly, the \meta{\MP{} preamble} is usually almost empty, but +% you may add something with the methods described earlier; actually the +% only statement always added to the preamble is +%\begin{verbatim} +%outputtemplate:= "%j.mps"; +%\end{verbatim} +% in order to give the resulting file a suitable name for automatic +% inclusion in the \LaTeX{} document. Don't issue such a statement +% yourself. +% +% In the \meta{body of the environment} you can put \TeX{} or \LaTeX{} +% commands as usual for \MP{} code inside \texttt{btex \meta{\TeX{} +% material} etex}; in a \texttt{mpost} environment, however, +% \LaTeX{} commands may be embedded in the normal \MP{} statements, +% we'll call them \emph{naked}. +% +% +% \subsection{Naked \TeX{} commands in the body of +% \texttt{mpost}} +% +% The \emph{naked} commands will be expanded in the normal way, it's up +% to you to ensure that their expansion is valid \MP{} code. Don't +% use dimension parameters by themselves: for example, the command +% \cmdname{linewidth} is \emph{unexpandable}, so \MP{} will interpret +% it as the variable \texttt{linewidth}, which probably would be +% unknown. +% +% Suppose you want that your \MP{} graphic objects have a uniform aspect +% throughout the document, but you haven't decided yet what will be the +% final background color for a series of pictures. All you need is to +% use something like +%\begin{verbatim} +%fill p withrgbcolor \backgroundcolor; +%\end{verbatim} +% and to give in the document's preamble a definition such as +%\begin{verbatim} +%\newcommand*{\backgroundcolor}{(.124,.048,.129)} +%\end{verbatim} +% and your backgrounds will be the same in all the pictures. Of course +% there are other methods to get this result: one might say also +%\begin{verbatim} +%\gmpoptions{everymp={rgbcolor mybgcolor; +% mybgcolor:=(.124,.048,.129)}} +%\end{verbatim} +% or write a definition file to be read via \texttt{everymp}; but I +% believe that the \emph{naked command} method is preferable from the +% point of view of a \LaTeX{} user: it requires less maintenance and is +% more direct. +% +% In order to pass length parameters to \MP{}, the \cmdname{mpdim} +% command is useful. If you know that the parameter is a fixed length +% (such as \cmdname{linewidth}), you can use also \cmdname{the} before +% the name of the length parameter. Beware however that most parameters +% in \LaTeX{} are defined through \cmdname{newlength} and so they are +% \emph{rubber} length, possibly having `plus' or `minus' components +% which would confuse \MP{}. Using \cmdname{mpdim} is safer. +% Moreover, \cmdname{mpdim} accepts its argument in the usual braced +% form. +% +% Pay attention that the expansion of \cmdname{mpdim} is not only the +% length in points, but something more complicated. Don't use it +% outside \texttt{mpost} environments. +% +% Any command whose expansion is just a string of characters can be used +% naked in a \texttt{mpost} environment; \MP{} will see the string of +% letters and it's under your responsibility that this string is +% meaningful in the context it's found. For example, after +%\begin{verbatim} +%\newcommand{\xxx}[1]{#1cm} +%\end{verbatim} +% has been given in the \LaTeX{} root file, \cmdname{xxx}\marg{2} can be +% written in a \texttt{mpost} environment, where \MP{} expects a +% numeric value; for instance, +%\begin{verbatim} +%a:=\xxx{2}; +%\end{verbatim} +% would set the variable `\texttt{a}' to the value `\texttt{56.6929}', +% which are indeed two centimeters, since \MP{} works internally in +% `big~points'. Pay attention that +%\begin{verbatim} +%a:=2\xxx{2}; +%\end{verbatim} +% would set the variable `\texttt{a}' to the value `\texttt{623.62192}' +% which corresponds to 22~centimeters and not to `\texttt{113.3858}' +% (i.e., 4~centimeters). The correct way to set `\texttt{a}' to +% 4~centimeters would be \verb|a:=2*\xxx{2};|. +% +% +% \subsection{Commands inside +% \texttt{[verbatim\string|btex]...etex}}\label{btex} +% +% This is an important point where the \MP{} input in a +% \texttt{mpost} environment deviates slightly from the normal +% one. Suppose that you have to write a label inside \MP{} in the +% form +%\begin{verbatim} +%btex \textit{label} etex +%\end{verbatim} +% because you want it in italics. We have a problem here, because the +% command \cmdname{textit} passes through a \cmdname{write}, so that it +% is expanded to something that is not what the \MP{} interpreter +% likes to see; precisely, the expansion might be something like +%\begin{verbatim} +%\protect \relax \protect \edef n{it}\protect\xdef +%\OT1/cmr/m/n/10 {\OT1/cmr/m/n/10 }\OT1/cmr/m/n/10 +%\size@update \enc@update +%\end{verbatim} +% (all on one line). This will confuse the postprocessors that typeset +% the labels (that currently are integrated into \MP{}), either if we +% are using \LaTeX{} or, even worse, Plain \TeX{}. +% +% The solution is to write \cmdname{verbatimtex} and \cmdname{btex} +% instead of \texttt{verbatimtex} and \texttt{btex}. The leading +% backslash would be legal also in standard \MP{}, anyway. +% Everything inside +%\begin{verbatim} +%\verbatimtex ... etex +%\btex ... etex +%\end{verbatim} +% is passed as is to the compiler for producing the \texttt{mpx} files +% needed by \MP{}. So the correct way to pass the label is +%\begin{verbatim} +%\btex \textit{label} etex +%\end{verbatim} +% when post-processing with \LaTeX{} and +%\begin{verbatim} +%\btex \it label etex +%\end{verbatim} +% when post-processing with Plain \TeX{}. Though using \texttt{btex} +% without a backslash has its uses, remember that eight bit characters +% \emph{must} go inside \verb|\btex...etex| or protected by +% \cmdname{unexpanded} (unless you're using \XeLaTeX{}). So, never say +% \begin{flushleft}\color{red} +% \verb|btex Cuvщщ 1982 etex| +% \end{flushleft} +% but choose among the following alternatives: +%\begin{verbatim} +%\btex Cuvщщ 1982 etex +%btex \unexpanded{Cuvщщ} 1982 etex +%btex Cuv\unexpanded{щщ} 1982 etex +%\end{verbatim} +% +% \begin{annotation} +% \TeX{}nical note. When I started developing this package, the +% choice to write verbatim the \MP{} input was ruled out almost +% immediately, since I wanted to pass parameters from \LaTeX{} to +% \MP{}. The verbatim method is used by \textsf{emp}, which makes +% available only two parameters given as arguments to the \texttt{emp} +% environment; for example |\begin{emp}(23,45)| puts at the user's +% disposal the two \MP{} variables `\texttt{w}' and `\texttt{h}' with +% values $23$~times and $45$~times the usual \LaTeX{} parameter +% \cmdname{unitlength}. Passing to \MP{} the \cmdname{linewidth} is +% pretty complicated, since it requires to divide the +% \cmdname{linewidth} by the unit length. Moreover, only two +% parameters are too few. +% +% Therefore I chose to write the \MP{} files expanding commands. This +% works since \MP{} instructions have no backslashes in them and the +% command \cmdname{mpdim} used for passing parameters from the current +% document is especially tailored in order that its expansion is +% accepted by \MP{}. With the obvious exception of things inside +% \texttt{btex...etex}. The solution exploits the +% \cmdname{unexpanded} command made available by the modern \TeX{} +% engines. +% +% The construction \verb|\btex...etex| is equivalent to write +%\begin{verbatim} +%btex \unexpanded{...} etex +%\end{verbatim} +% and what is written to the \MP{} file is precisely +%\begin{verbatim} +%btex ... etex +%\end{verbatim} +% with no expansion of commands. +% \end{annotation} +% +% There is another catch: for \TeX{}nical reasons, environments in +% \verb|\btex...etex| parts cannot be used without protection. This +% is because the \MP{} input is gathered as an argument delimited by +% \cmdname{end}. The solution is to put the inner environments inside +% braces. An example, taken from Hoenig~\cite[p.~416]{hoenig}, is +% found in figure~\ref{hoenigsun}, where the input is just like +% Hoenig's except for a minor correction (\texttt{3.5u} in the +% original should be \texttt{4.5u}) and having put everything inside +% \verb|\btex...etex| in braces (and writing \cmdname{btex} instead of +% \texttt{btex}, of course). +% +% \begin{figure} +% \caption{An example from Alan Hoenig's book}\label{hoenigsun} +%\begin{verbatim} +%\begin{mpost}[mpxprogram=latex,mpsettings={input boxes;}] +%u:=1pc; path p[]; p0=(-6u,0) -- (6u,0); +%p1=(0,-4u)--(0,4u); +%p2=(0,-4.5u)--(0,4.5u); p2:=p2 rotated -45; +%circleit mech(\btex +%{\fontsize{8}{10}\selectfont +%$\begin{array}{c} +%\sigma_{ij,j}=0\\ +%\sigma_{ij}=c_{ijk\ell}\epsilon_{k\ell}\\ +%\epsilon_{ij}=\frac{1}{2}(u_{i,j}+u_{j,i}) +%\end{array}$} +%etex); +%mech.dx=mech.dy; mech.c=origin; +%pickup pencircle scaled 1pt; +%draw p0; draw p1; draw p2; draw p2 rotated 90; +%pickup pencircle scaled u; unfilldraw bpath.mech; +%pickup pencircle scaled 1pt; drawboxed(mech); +%\end{mpost} +%\end{verbatim} +% +% \centering +% \begin{mpost}[mpxprogram=latex,mpsettings={input boxes;}] +% u:=1pc; path p[]; p0=(-6u,0) -- (6u,0); +% p1=(0,-4u)--(0,4u); +% p2=(0,-4.5u)--(0,4.5u); p2:=p2 rotated -45; +% circleit mech(\btex +% \fontsize{8}{10}\selectfont +% $\array{c} +% \sigma_{ij,j}=0\\ +% \sigma_{ij}=c_{ijk\ell}\epsilon_{k\ell}\\ +% \epsilon_{ij}=\frac{1}{2}(u_{i,j}+u_{j,i}) +% \endarray$ +% etex); +% mech.dx=mech.dy; mech.c=origin; +% pickup pencircle scaled 1pt; +% draw p0; draw p1; draw p2; draw p2 rotated 90; +% pickup pencircle scaled u; unfilldraw bpath.mech; +% pickup pencircle scaled 1pt; drawboxed(mech); +% \end{mpost} +% \end{figure} +% +% Another way to cope with this would be to write simply \cmdname{array} +% instead of \cmdname{begin}\marg{array} and \cmdname{endarray} instead +% of \cmdname{end}\marg{array}, which is how the \texttt{mpost} +% environment for this example has actually been written. +% +% +% \section{Definitions using the \texttt{mpost} environment} +% +% Some examples have already been presented, but it's best to +% underline again that the environment can go inside the replacement +% text of a definition; don't use \cmdname{mpost} and +% \cmdname{endmpost}, though, just |\begin{mpost}| and +% |\end{mpost}|. Commands defined this way are \emph{fragile}: don't +% use them in moving arguments. As an example, we can use a variation +% on a drawing from~\cite{hoenig}: +%\begin{verbatim} +%\newcommand{\squares}[2][black]{% +% \begin{mpost} +% boolean timetofillbox; +% sfactor:=.95; +% path p,q; u:=\mpdim{#2\textwidth}/2; +% p := (u,u) -- (-u,u) -- (-u,-u) -- (u,-u) -- cycle; +% theta := 0; dtheta := .005; +% forever: +% theta := theta+dtheta; +% q := p scaled sfactor rotated theta; +% exitif ypart(point 0 of q) > u; +% endfor; +% fill p withrgbcolor #1; timetofillbox:=false; +% for i:=1 upto 51: +% p := p scaled sfactor rotated theta; +% if timetofillbox: +% fill p withrgbcolor #1; timetofillbox:=false; +% else: +% fill p withrgbcolor white-#1; timetofillbox:=true; +% fi +% endfor +% \end{mpost}} +%\end{verbatim} +% The optional argument is an \textsc{rgb} color, either with a +% predefined name such as \texttt{black} (default) or a triple such as +% \texttt{(.165,.325,.553)}; the second argument is the size of the +% square, expressed as a fraction of \cmdname{textwidth}, for example +% \texttt{0.8}. In figure~\ref{squares} you get three variations input +% as +%\begin{verbatim} +%\begin{minipage}{\textwidth} +%\centering\offinterlineskip +%\squares{.4}\squares[(.165,.325,.553)]{.4}\\ +%\squares[(.835,.685,.447)]{.8} +%\end{minipage} +%\end{verbatim} +% that also show how \textsf{gmp} uses the hi-res bounding box provided +% by \MP{}. +% +% \begin{figure} +% \medskip +% \begin{minipage}{\textwidth} +% \centering\offinterlineskip +% \squares{.4}\squares[(.165,.325,.553)]{.4}\\ +% \squares[(.835,.685,.447)]{.8} +% \end{minipage} +% \medskip +% \caption{Squares taken from Hoenig's book}\label{squares} +% \end{figure} +% +% +% \section{The \texttt{mpost*} environment} +% +% No command in the body of the \texttt{mpost*} environment will be +% interpreted in any special way, so don't use them except than +% encapsulated into \texttt{btex...etex}. Here there's no need to write +% \cmdname{btex}, but it doesn't hurt either. It's however necessary to +% hide inside braces the \LaTeX{} command \cmdname{end} like for the +% sibling environment \texttt{mpost}. It's possible to pass variables to +% the picture from the \LaTeX{} context by exploiting the option +% \texttt{mpsettings}: for example, with a prologue such as +%\begin{verbatim} +%\begin{mpost*}[mpsettings{u:=\mpdim{\unitlength}}] +%\end{verbatim} +% you'll be able to use in the \MP{} code the variable $u$ which will be +% set to the current \cmdname{unitlength} (don't say \texttt{save u;} in +% the \MP{} code, of course). +% +% The \texttt{mpost*} environment \emph{can} go inside the argument +% to a command. +% +% +% \section{\XeLaTeX{} and \textsf{gmp}} +% +% The present package is compatible with \XeLaTeX{}; in this case it +% performs also a conversion to \textsc{pdf} of the \textsc{mps} file +% for inclusion. There are some limitations, though: it's impossible to +% typeset labels to pictures with system fonts, as it would be in the +% main document. Indeed \MP{} can't use \XeTeX{} for typesetting the +% labels, only \LaTeX{}; this limitation is in \MP{}, we hope that in +% the future it will be removed. If your main font is Linux Libertine, +% for instance, you can typeset labels by saying +%\begin{verbatim} +%\usempxpackage[utf8]{inputenc} +%\usempxpackage{libertine} +%\end{verbatim} +% (possibly passing some option to the latter package). Many fonts that +% you can use with \XeLaTeX{} can also be used in \LaTeX{}, of course +% without access to the full character set. +% +% +% \section{Examples} +% +% Let's try some weird input with foreign characters. +%\begin{verbatim} +%\usepackage[latin1]{inputenc} +%... +%\usempxpackage[latin1]{inputenc} +%... +%\begin{center} +%\begin{mpost}[mpxprogram=latex] +%label(\btex ршќ etex, origin); +%draw fullcircle xscaled 1.5cm yscaled 2\mpdim\baselineskip; +%\end{mpost} +%\end{center} +%\end{verbatim} +% \begin{center} +% \usempxpackage[latin1]{inputenc} +% \begin{mpost}[mpxprogram=latex] +% label(\btex ршќ etex, origin); +% draw fullcircle xscaled 1.5cm yscaled 2\mpdim\baselineskip; +% \end{mpost} +% \end{center} +% Always use the same option to \textsf{inputenc} as your main +% file or, if you are working with \XeLaTeX{}, +%\begin{verbatim} +%\usempxpackage[utf8]{inputenc} +%\end{verbatim} +% in your document's preamble. Also \texttt{utf8x} is acceptable, of +% course, in this case. +% +% Let's see instead a case where expansion in a \texttt{btex...etex} +% construction is needed: we want to enclose numbers, colored in white, +% inside an elliptical gray background. The vertical axis of the +% ellipse should be as high as the baseline skip and it should be a +% circle if the number has only one digit; the additional problem is +% that the number can be given as the representation of some counter +% (for example \texttt{enumi}, a possible application is evident). +%\begin{verbatim} +%\newcounter{mycount} +%\newlength{\mylen} +%\newcommand{\circleit}[2][]{\settowidth{\mylen}{#2}% +% \begin{mpost}[mpxprogram=latex] +% fill fullcircle +% xscaled max(\mpdim{\mylen+6pt},\mpdim{\baselineskip}) +% yscaled \mpdim{\baselineskip} +% withcolor .4white; +% draw thelabel(btex \unexpanded{#1}#2 etex, origin) +% withcolor white; +% \end{mpost}} +% +%\circleit{\themycount}\quad +%\setcounter{mycount}{3}\circleit{\themycount}\quad +%\setcounter{mycount}{12}\circleit{\themycount}\quad +%\renewcommand{\themycount}{\roman{mycount}}% +%\circleit{\themycount}\quad +%\circleit{44}\quad +%\renewcommand{\themycount}{\arabic{mycount}}% +%\circleit[\sffamily]{\themycount} +%\end{verbatim} +% \begin{center} +% \newcounter{mycount} +% \newlength{\mylen} +% \newcommand{\circleit}[2][]{\settowidth{\mylen}{#2}% +% \begin{mpost}[mpxprogram=latex] +% fill fullcircle +% xscaled max(\mpdim{\mylen+6pt},\mpdim{\baselineskip}) +% yscaled \mpdim{\baselineskip} +% withcolor .4white; +% draw thelabel(btex \unexpanded{#1}#2 etex, origin) +% withcolor white; +% \end{mpost}} +% \circleit{\themycount}\quad +% \setcounter{mycount}{3}\circleit{\themycount}\quad +% \setcounter{mycount}{12}\circleit{\themycount}\quad +% \renewcommand{\themycount}{\roman{mycount}}% +% \circleit{\themycount}\quad +% \circleit{44}\quad +% \renewcommand{\themycount}{\arabic{mycount}}% +% \circleit[\sffamily]{\themycount} +% \end{center} +% +% In this case we \emph{want} that what is inside \texttt{btex...etex} +% is expanded, in case it is \cmdname{themycount}. Of course we have to +% be sure that the expansion of the command consists only of +% characters. So, for example, +%\begin{verbatim} +%\renewcommand{\themycount}{\textsf{\arabic{mycount}}} +%\end{verbatim} +% would not work for the last example. This is the reason for having +% defined an optional argument to \cmdname{circleit}. The trick of +% using this argument in \cmdname{unexpanded} keeps every program happy +% and the label is typeset correctly. More fun for the \TeX{}ackers! +% +% +% \section{Conversion from \textsf{emp}} +% +% It's quite easy to convert old files that use \textsf{emp} without +% changing too much; a typical \texttt{emp} environment is +%\begin{verbatim} +%\begin{emp}[xyz](15,30) +%...; +%\end{emp} +%\end{verbatim} +% where the dots stand for \MP{} statements and \texttt{xyz} is the name +% for subsequent use. This may be transformed into +%\begin{verbatim} +%\begin{mpost}[name=xyz,use] +%w:=\mpdim{15\unitlength}; +%h:=\mpdim{30\unitlength}; +%...; +%\end{mpost} +%\end{verbatim} +% An \texttt{empgraph} environment such as +%\begin{verbatim} +%\begin{empgraph}[xyz](15,30) +%...; +%\end{empgraph} +%\end{verbatim} +% must be transformed into +%\begin{verbatim} +%\begin{mpost}[name=xyz,use](15,30) +%w:=\mpdim{15\unitlength}; +%h:=\mpdim{30\unitlength}; +%draw begingraph(w,h); +%...; +%endgraph; +%\end{mpost} +%\end{verbatim} +% Remember to change all \texttt{btex} into \texttt{\string\btex} and +% the auxiliary commands into the similar ones of \textsf{gmp}: it +% should be almost straightforward. If people ask for it, I might add a +% compatibility layer for \textsf{emp}. +% +% Alternatively, the first case might be treated as +%\begin{verbatim} +%\begin{mpost*}[name=xyz, +% mpsettings={w:=\mpdim{15\unitlength}; +% h:=\mpdim{30\unitlength};}] +%...; +%\end{mpost*} +%\end{verbatim} +% You might prefer this strategy if you have many \texttt{btex...etex} +% pairs. Look out for \cmdname{end} commands, though: if not properly +% braced, they will confuse the processing of the environment's content. +% +% \StopEventually{ +% \begin{thebibliography}{1} +% +% \bibitem{hagen-metafun}% +% Hans Hagen, Metafun, +% \url{http://www.pragma-ade.nl/general/manuals/metafun-p.pdf} +% +% \bibitem{hoenig}% +% Alan Hoenig, \emph{\TeX{} unbound}, Oxford University Press, Oxford +% and New York, 1998. +% +% \bibitem{peter2005}% +% Steve Peter, ``\cmdname{starttext}, Swelled Rules and \MP{}'', The +% Prac\TeX{} Journal, n.~4 (2005). +% +% \end{thebibliography} +% } +% +% \section{Implementation} +% +% Before doing anything, we check that the engine knows about +% |\unexpanded| and |\dimexpr|; otherwise we say good-bye. +% \begin{macrocode} +\@ifundefined{eTeXversion}{% + \PackageError{gmp}{This package requires a e-TeX extensions} + {The gmp package requires a modern TeX engine, please upgrade}% + \endinput}{} +% \end{macrocode} +% We need \textsf{xkeyval} for its key-value interface. Then we define +% some conditional for later usage and the package options. +% \begin{macrocode} +\RequirePackage{xkeyval}[2005/01/30] + +\newif\ifgmp@latex % true if always using latex for mpx +\newif\ifgmp@locallatex % true if using latex for mpx for a + % single figure + +\newif\ifgmp@nogen % true if we are not generating the mps files +\newif\ifgmp@nowrite % true if we are not writing the mp files +\newif\ifgmp@warn % true if we are issuing the final message + +\DeclareOptionX<ggmp>{tex}{\def\gmp@mpxprogram{tex}% + \gmp@latexfalse\gmp@locallatexfalse} +\DeclareOptionX<ggmp>{latex}{\def\gmp@mpxprogram{latex}% + \gmp@latextrue\gmp@locallatextrue} + +\DeclareOptionX<ggmp>{noshellescape}{\gmp@nogentrue} +\DeclareOptionX<ggmp>{shellescape}{\gmp@nogenfalse} + +\DeclareOptionX<ggmp>{nowrite}{\gmp@nowritetrue} +\DeclareOptionX<ggmp>{write}{\gmp@nowritefalse} + +\DeclareOptionX<ggmp>{envname}{\def\gmp@envname{#1}} +\DeclareOptionX<ggmp>{extension}{\def\gmp@ext{#1}} + +\def\gmp@preoptions{} +\DeclareOptionX<ggmp>{everymp}{\edef\gmp@preoptions{\gmp@preoptions^^J#1}} + +\DeclareOptionX<ggmp>{clean}{\def\gmp@clean{#1}} + +\DeclareOptionX<ggmp>{rmcommand}{\def\gmp@remove{#1}} +\DeclareOptionX<ggmp>{postrmcommand}{\def\gmp@postremove{#1}} + +\def\gmp@jobname{\jobname} +% \end{macrocode} +% Now we set the default options: the mpx program is \TeX{}; we write +% out the auxiliary files and do not assume shell-escape; no cleaning +% after compilation of the \MP{} files; default environment names are +% \texttt{mpost} and \texttt{mpost*}; default mp-extension is +% \texttt{+mp}. Then we read the package options. +% \begin{macrocode} +\ExecuteOptionsX<ggmp>{tex,noshellescape,write,clean=none} +\ExecuteOptionsX<ggmp>{envname=mpost,extension=+mp, + rmcommand=rm -f,postrmcommand={}} +\ProcessOptionsX<ggmp>\relax +% \end{macrocode} +% We need some auxiliary packages, they'll probably be loaded anyway, +% with the exception of \textsf{environ} that's employed for the +% \texttt{mpost*} environment, but has no known incompatibility. +% \begin{macrocode} +\RequirePackage{graphicx} +\RequirePackage{ifpdf} +\RequirePackage{ifxetex} +\RequirePackage{environ} +% \end{macrocode} +% With \XeLaTeX{} we need to run epstopdf; we don't support +% Lua\LaTeX{}, because looking at shell-escape is useless, at the +% moment, even via Heiko Oberdiek's \textsf{pdftexcmds} (at least for +% the time being). +% \begin{macrocode} +\ifxetex + \let\gmp@shellescape\shellescape + \def\gmp@preoptions{prologues:=3;^^J} +\else + \ifdefined\pdfshellescape % (pdf)latex + \let\gmp@shellescape\pdfshellescape + \else % lualatex + \chardef\gmp@shellescape=\z@ + \gmp@nogentrue + \fi +\fi +% \end{macrocode} +% We define some warning messages; in some cases the message enables +% or disables other messages. +% \begin{macrocode} +\def\gmp@msgdisallowed{\PackageWarningNoLine{gmp}{Compilation and + writing of MetaPost files has been\MessageBreak disallowed by the + `nowrite' option}\gdef\gmp@nemessage{}} +\def\gmp@msgnonexistent{\PackageWarning{gmp}{Non existent MetaPost + file requested}\ifgmp@warn\else\global\gmp@warntrue\fi} +\def\gmp@msgrequestx{\PackageWarningNoLine{gmp}{The MetaPost file you + requested does not exist,\MessageBreak perhaps by a compilation + error}} +\def\gmp@msgremember{\PackageWarningNoLine{gmp}{Remember to run `sh + \gmp@jobname\gmp@ext.sh' and rerun (pdf)LaTeX}} +% \end{macrocode} +% The following lines are to avoid spurious messages, opening and +% writing of files if the user has not activated the shell escape +% feature but has given the shell-escape option. +% \begin{macrocode} +\def\gmp@msgensure{% + \PackageWarningNoLine{gmp}{Ensure that you have enabled the shell + escape feature, or\MessageBreak you can be in trouble. The + available MetaPost generated\MessageBreak files will be used + anyway. Use option `nowrite' if they\MessageBreak are already + in final form}% + \let\gmp@message\@gobble + \let\gmp@writexviii\@gobble + \def\gmp@openout##1##2\@nil{}% + \let\gmp@write\@gobbletwo + \let\gmp@closeout\@gobble} +% \end{macrocode} +% Now we define some abbreviations for primitive actions, so that we +% are able to change their meaning at will. +% \begin{macrocode} +\let\gmp@message\message +\def\gmp@writexviii{\immediate\write18 } +\def\gmp@openout#1#2\@nil{\immediate\openout#1#2} +\def\gmp@write{\immediate\write} +\def\gmp@closeout{\immediate\closeout} +% \end{macrocode} +% \begin{macro}{\gmp@command} +% Here we define the main internal macro, |\gmp@command|, which has +% different definitions depending on the package options. If the +% \texttt{nowrite} option is valid, there's even no need for it; +% otherwise it must behave differently: if we are doing immediate +% compilation via shell-escape it must act by emitting +% |\gmp@writexviii|, otherwise it must write the command in the batch +% file to be run after the \LaTeX{} run. In the latter case we also +% open an output stream and write a prologue on it. +% \begin{macrocode} +\def\gmp@setupmacros{% +\ifgmp@nowrite + \let\gmp@nemessage\gmp@msgdisallowed +\else + \ifgmp@nogen + \let\gmp@nemessage\gmp@msgnonexistent + \def\gmp@command{% + mpost \ifx\gmp@mpmem\empty\else\space\gmp@mpmem\space\fi}% + \newwrite\gmp@shellout + \immediate\openout\gmp@shellout=\gmp@jobname\gmp@ext.sh% + \immediate\write\gmp@shellout{\string##!/bin/sh}% + \def\gmp@shellcommand##1{\immediate\write\gmp@shellout{##1}}% + \AtEndDocument{\ifgmp@warn\gmp@msgremember\gmp@warnfalse\fi}% + \else + \let\gmp@nemessage\gmp@msgrequestx + \ifnum\gmp@shellescape=\@ne + \def\gmp@command{% + mpost -interaction=nonstopmode % + \ifx\gmp@mpmem\empty\else\space\gmp@mpmem\space\fi}% + \def\gmp@shellcommand##1{% + \gmp@message{^^J(gmp) Doing external command^^J(gmp) \string"}% + \gmp@writexviii{echo ##1'\string"'}\gmp@writexviii{##1}% + }% + \else + \gmp@msgensure\let\gmp@shellcommand\@gobble + \fi + \fi +\fi +} +\gmp@setupmacros +% \end{macrocode} +% \end{macro} +% \begin{macro}{\gmpoptions} +% Next we define |\gmpoptions| which can be used to set package +% options in a more friendly way. However we disallow it outside the +% preamble, because otherwise the status of the macros would not be +% predictable. +% \begin{macrocode} +\def\gmpoptions#1{\setkeys{ggmp}{#1}\gmp@setupmacros} +\@onlypreamble\gmpoptions +% \end{macrocode} +% \end{macro} +% We next define a standard \LaTeX{} preamble for mpx. +% \begin{macrocode} +\def\gmp@latexpreamble{%^^J% + \gmp@percent\string&latex^^J% + \string\documentclass[1\@ptsize pt]{article}^^J% + \ifx\empty\gmp@packages\else\the\gmp@packages^^J\fi% + \ifx\empty\gmp@commands\else\the\gmp@commands^^J\fi% + \string\begin{document}^^J} +% \end{macrocode} +% \begin{macro}{\usempxclass}\begin{macro}{\usempxpackage} +% If one wants a non standard \LaTeX{} class, the command +% |\usempxclass|, with the same syntax as |\documentclass|, is +% provided. Similarly for |\usempxpackage|; |\resetmpxpackages| clears +% out the loading of packages. +% \begin{macrocode} +\newcommand\usempxclass[2][]{% + \def\gmp@latexpreamble{^^J% + \gmp@percent\string&latex^^J% + \string\documentclass[#1]{#2}^^J% + \ifx\empty\gmp@packages\else\the\gmp@packages^^J\fi% + \ifx\empty\gmp@commands\else\the\gmp@commands^^J\fi% + \string\begin{document}^^J}} +\newtoks\gmp@packages +\newcommand\usempxpackage[2][]{% + \gmp@packages=\expandafter{\the\gmp@packages^^J% + \usepackage[#1]{#2}}} +\newcommand\resetmpxpackages{\gmp@packages={}} +% \end{macrocode} +% \end{macro}\end{macro} +% \begin{macro}{\mpxcommands} +% With |\mpxcommands| one can insert definitions to be used for \MP{} +% label composition: these are seen only if \LaTeX{} is used for +% mpx. There's also |\resetmpxcommands| in case of need. +% \begin{macrocode} +\newtoks\gmp@commands +\newcommand\mpxcommands[1]{% + \gmp@commands=\expandafter{\the\gmp@commands^^J% + #1}} +\newcommand\resetmpxcommands{\gmp@commands={}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\mpdim} +% The |\mpdim| macro is used in the \texttt{mpost} environment or in +% the value of the key \texttt{mpsettings} for passing length +% depending on current conditions. We exploit |\dimexpr| that strips +% out possible `elastic' components and allows for doing +% calculations. The result is written out surrounded by +% \texttt{begingroup} and \texttt{endgroup} that make the number +% obtained look like a variable at \MP's eyes. +% \begin{macrocode} +\def\mpdim#1{ begingroup \the\dimexpr#1\relax\space endgroup } +% \end{macrocode} +% \end{macro} +% Now we start the hard task of writing out the auxiliary files. So we +% define an output stream and a counter that keeps track of the figure +% names; in order to know the total number of the pictures, at +% end-of-document we define an internal label which is currently +% unused, though. +% \begin{macrocode} +\newwrite\gmp@out +\newcounter{gmp@count} +\AtEndDocument{% + \refstepcounter{gmp@count}% + \label{gmp@finallabel}% +} +% \end{macrocode} +% \begin{environment}{mpost} +% The \texttt{mpost} environment (but the name can be set at package +% loading) must read the `local options' given as an optional argument +% as the usual list of key-value statements. First of all it must step +% the \MP{} figure counter and set a label for it for subsequent +% calling of the graphics, then we grab the option given to the +% environment. +% \begin{macrocode} +\newenvironment{\gmp@envname}[1][] + {\@bsphack + \global\gmp@usefalse + \refstepcounter{gmp@count}\label{gmp@label@\thegmp@count}% + \bgroup + \edef\gmp@number{\thegmp@count}% + \gmp@grab{#1}} + {\@esphack} +% \end{macrocode} +% \end{environment} +% \begin{environment}{mpost*} +% The \texttt{mpost*} environment writes out its contents without +% \TeX{} macro expansion; we simply use \texttt{mpost}: so we gather +% the optional argument into a scratch token register, collect the +% body of the environment and pass it to the |\gmp@writeunex| macro +% which calls |\begin{mpost}| (possibly with the name chosen by the +% user), to which are passed the options. The first |\unexpanded| is +% removed by |\edef|, the second one by the writing process. +% \begin{macrocode} +\def\gmp@writeunex#1{\begingroup + \edef\x{\endgroup\noexpand\begin{\gmp@envname}[\the\toks@]% + \unexpanded{\unexpanded{#1}}\noexpand\end{\gmp@envname}}\x} +\newenvironment{\gmp@envname*}[1][] + {\toks@{#1}\Collect@Body\gmp@writeunex}{} +% \end{macrocode} +% \end{environment} +% Here we define the key-value interface for the options to the +% environments, with some auxiliary macros and conditionals; +% |\gmp@fourdigits| is used for the output file names, we think that +% more than $9999$ pictures are difficult to be present for a single +% file; but this will not limit at all the user's possibilities. +% \begin{macrocode} +\def\gmp@fourdigits#1{% + \ifnum#1<10 0\fi + \ifnum#1<100 0\fi + \ifnum#1<1000 0\fi\number #1} +\def\gmp@not@a@name@{@not@a@name@} +\def\gmp@choosetex{\gmp@locallatexfalse} +\def\gmp@chooselatex{\gmp@locallatextrue} +\def\gmp@doiflatex#1{\ifgmp@latex#1\else\ifgmp@locallatex#1\fi\fi} +\def\gmp@mpmem{} +\newif\ifgmp@use +\define@key{gmp}{name}[@not@a@name@]{% + \def\gmp@thisname{#1}% + \expandafter\xdef\csname gmp@fig#1\endcsname + {\gmp@fourdigits{\gmp@number}}} +\define@key{gmp}{use}[true]{\global\csname gmp@use#1\endcsname} +\define@key{gmp}{mpmem}{\def\gmp@mpmem{-mem #1}} +\define@key{gmp}{mpsettings}{\edef\gmp@preoptions{\gmp@preoptions^^J#1}} +\define@key{gmp}{mpxcommands}{% + \gmp@commands=\expandafter{\the\gmp@commands^^J#1}} +\define@key{gmp}{mpxprogram}{% + \def\gmp@mpxprogram{#1}% + \csname gmp@choose#1\endcsname} +\define@key{gmp}{runs}{\chardef\gmp@runs=#1\relax} +% \end{macrocode} +% \begin{macro}{\gmp@grab} +% The |\gmp@grab| macro sets the value of the keys; the \texttt{name} +% must be initially empty and the number of runs should be~$1$. The +% conditional |\if@gmpuse| is set to false at the beginning of the +% environment, and to true when \texttt{use} is given or when there's +% no name. Finally the macro calls |\gmp@innermpost|. +% \begin{macrocode} +\def\gmp@grab#1{% + \setkeys{gmp}{name}% + \setkeys{gmp}{runs=1}% + \setkeys{gmp}{#1}% + \ifx\gmp@thisname\gmp@not@a@name@ + \global\gmp@usetrue + \fi + \gmp@setup\gmp@innermpost} +% \end{macrocode} +% \end{macro} +% Before defining the macro responsible for the task of writing out +% the \MP{} files, we do some housekeeping. +% +% We ensure that the character we need are written correctly in the +% \MP{} files; so we define a `printing' percent sign and change the +% category code of characters that might be made active by +% \textsf{babel} or other packages. The semicolon is made active: it +% will output a semicolon followed by a new line character; in the +% environment |\par| means `go to a new line', so that empty lines in +% a \texttt{mpost} environment will cause a new line in the output +% file. However this doesn't work currently for \texttt{mpost} +% environments given as arguments to other commands; since the normal +% buffer size is around $50\,000$, this should not be a problem. +% \begin{macrocode} +\begingroup\@makeother\%\def\x{\endgroup\def\gmp@percent{%}}\x +\def\gmp@activesc{\catcode`\;=\active + \begingroup\lccode`\~=`\; + \lowercase{\endgroup\edef~}{\string;^^J}} +\def\gmp@otherchars{\do\!\do\=\do\:\do\"\do\?\do\'\do\`\do\|} +% \end{macrocode} +% \begin{macro}{\gmp@setup} +% The following macro |\gmp@setup| starts writing the output files, +% after setting category codes and something else; it doesn't write +% anything if the option \texttt{nowrite} is in force, otherwise +% writes a prologue and all needed preliminaries, up to +% \texttt{beginfig(}\meta{number}\texttt{)}; this number is actually +% irrelevant, because we use \texttt{outputtemplate}, but it should +% correspond to the number appearing in the name of the output file. +% \begin{macrocode} +\def\gmp@setup{% + \let\do\@makeother\gmp@otherchars\newlinechar=`\^^J + \gmp@activesc + \def\par{^^J}% + \ifgmp@nowrite\else + \edef\@temp{\gmp@jobname\gmp@ext\gmp@fourdigits{\gmp@number}.mp}% + \expandafter\gmp@openout\expandafter\gmp@out\@temp\@nil + \gmp@write\gmp@out{% + \gmp@percent\gmp@percent\space + Do not edit, this file has been generated^^J% + \gmp@percent\gmp@percent\space + automatically by \jobname.tex via gmp.sty^^J^^J% + \gmp@doiflatex{verbatimtex\gmp@latexpreamble etex;^^J}% + \ifx\empty\gmp@preoptions\else\gmp@preoptions^^J\fi% + outputtemplate:= "\gmp@percent j.mps";^^J% + beginfig(\gmp@number);%^^J% + }% + \fi} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\gmp@innermpost} +% This is the central macro which collects the body of the +% environment; we chose to use |\end| as delimiter so that the +% environment can be used inside other arguments or definitions; maybe +% it's not the best way to do this, but other than requiring +% protection of |\end| commands inside the environment seems to have +% no side effects. The environment's content is written out to the +% \MP{} file, followed by \texttt{endfig;} and \texttt{end}; if +% \LaTeX{} is used for the labels, also the closing statements are +% added (though they are not strictly necessary). Then +% |\gmp@shellcommand| is performed one or more times according to the +% value of \texttt{runs}. It will run \MP{} stopping \LaTeX{} +% momentarily or write the command to the shell script, according to +% the current package options. In the case of \XeLaTeX{} it will also +% call or write for a run of \textsf{epstopdf}. Finally, it executes +% |\end{mpost}| and uses the object if it has been requested to do, +% that is, if |\ifgmp@use| is true. +% \begin{macrocode} +\long\def\gmp@innermpost#1\end#2{% + \ifgmp@nowrite\else + \gmp@write\gmp@out{% + #1^^Jendfig;^^Jend.% + \gmp@doiflatex{^^Jverbatimtex^^J\string\end{document}^^Jetex}}% + \gmp@closeout\gmp@out + \count@=\gmp@runs + \loop\ifnum\count@>\z@ + \gmp@shellcommand{\gmp@command\space + -tex=\gmp@mpxprogram\space\gmp@jobname\gmp@ext + \gmp@fourdigits{\gmp@number}}% + \advance\count@\m@ne + \repeat + \ifxetex + \gmp@shellcommand{epstopdf --hires \gmp@jobname\gmp@ext + \gmp@fourdigits{\gmp@number}.mps}% + \fi + \fi + \egroup + \end{#2}\ifgmp@use + \gmp@usempost{\thegmp@count}\fi} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\usempost} +% The macros for using the compiled pictures are almost straightforward: +% the files will have extension \texttt{.mps} for \LaTeX{} or +% \textsc{pdf}\LaTeX{} and \texttt{.pdf} for \XeLaTeX{}. We check that +% they exist and load them or issue a warning. +% \begin{macrocode} +\ifxetex + \def\gmp@usempost#1{% + \edef\gmp@thempsfile{\gmp@jobname\gmp@ext\gmp@fourdigits{#1}}% + \IfFileExists{\gmp@thempsfile.pdf}% + {\includegraphics{\gmp@thempsfile.pdf}}% + {\gmp@nemessage\gmp@box}} + \newcommand\usempost[2][]{% + \IfFileExists{\gmp@jobname\gmp@ext\csname gmp@fig#2\endcsname.pdf}% + {\includegraphics[#1] + {\gmp@jobname\gmp@ext\csname gmp@fig#2\endcsname.pdf}}% + {\gmp@nemessage\gmp@box}} +\else + \def\gmp@usempost#1{% + \edef\gmp@thempsfile{\gmp@jobname\gmp@ext\gmp@fourdigits{#1}}% + \IfFileExists{\gmp@thempsfile.mps}% + {\includegraphics[hiresbb]{\gmp@thempsfile.mps}}% + {\gmp@nemessage\gmp@box}} +\newcommand\usempost[2][]{% + \IfFileExists{\gmp@jobname\gmp@ext\csname gmp@fig#2\endcsname.mps}% + {\includegraphics[hiresbb,#1] + {\gmp@jobname\gmp@ext\csname gmp@fig#2\endcsname.mps}}% + {\gmp@nemessage\gmp@box}} +\fi +\def\gmp@box{\fbox{\@ifundefined{color}{}{\color{red}}MP}} +% \end{macrocode} +% \end{macro} +% Now we clean up our directory from the auxiliary files, at the +% user's request, of course. The \texttt{clean} keyword may be +% specified in the package options or in |\gmpoptions| to have a value +% among |none|, |aux|, or |mp|. +% +% At end document we look at the value of this key and do what's +% desired by the user. If the value is not recognized we issue a +% warning and act as if |clean=none| had been given; otherwise we +% execute the requested command or write them in the batch script. +% \begin{macrocode} +\AtEndDocument{% + \@ifundefined{gmp@doclean@\gmp@clean} + {\expandafter\gmp@badcleaning\expandafter{\gmp@clean}} + {\@nameuse{gmp@doclean@\gmp@clean}}} +\def\gmp@badcleaning#1{\PackageWarningNoLine{gmp}{% + Wrong cleaning option `clean=#1'; `clean=none' used}} +\def\gmp@doclean@none{} +\def\gmp@doclean@aux{% + \gmp@shellcommand{\gmp@remove\space + \jobname\gmp@ext*.log\space\gmp@postremove}% + \gmp@shellcommand{\gmp@remove\space + \jobname\gmp@ext*.mpx\space\gmp@postremove}% + \gmp@shellcommand{\gmp@remove\space + \jobname\gmp@ext*.mpo\space\gmp@postremove}% + } +\def\gmp@doclean@mp{% + \gmp@shellcommand{\gmp@remove\space + \jobname\gmp@ext*.log\space\gmp@postremove}% + \gmp@shellcommand{\gmp@remove\space + \jobname\gmp@ext*.mpx\space\gmp@postremove}% + \gmp@shellcommand{\gmp@remove\space + \jobname\gmp@ext*.mpo\space\gmp@postremove}% + \gmp@shellcommand{\gmp@remove\space + \jobname\gmp@ext*.mp\space\gmp@postremove}% + \ifxetex + \gmp@shellcommand{\gmp@remove\space + \jobname\gmp@ext*.mps\space\gmp@postremove}% + \fi} +% \end{macrocode} +% \begin{macro}{\verbatimtex}\begin{macro}{\btex} +% Final definition for not expanding macros in the \MP{} labels. +% \begin{macrocode} +\long\def\verbatimtex#1etex{verbatimtex \unexpanded{#1} etex} +\long\def\btex#1etex{btex \unexpanded{#1} etex} +% \end{macrocode} +% \end{macro}\end{macro} +% \Finale +\endinput + +% Local Variables: +% mode: doctex +% coding: latin-1 +% End: diff --git a/Master/texmf-dist/source/latex/gmp/gmp.ins b/Master/texmf-dist/source/latex/gmp/gmp.ins new file mode 100644 index 00000000000..6001574f9f9 --- /dev/null +++ b/Master/texmf-dist/source/latex/gmp/gmp.ins @@ -0,0 +1,71 @@ +% Copyright (C) 2011 by Enrico Gregorio +% <Enrico dot Gregorio at univr dot it> +% ------------------------------------------------------- +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either +% version 1.3c of this license or (at your option) any +% later version. The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3 or later is part of all distributions +% of LaTeX version 2005/12/01 or later. +% +% This work has the LPPL maintenance status `maintained'. +% +% The Current Maintainer of this work is Enrico Gregorio. +% +% This work consists of the files +% gmp.dtx +% gmp.ins +% and the derived file gmp.sty. + +\input docstrip.tex +\keepsilent + +\usedir{tex/latex/gmp} + +\preamble + +This is a generated file. + +Copyright (C) 2011 by Enrico Gregorio +<Enrico dot Gregorio at univr dot it> +------------------------------------------------------- + +This work may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either +version 1.3c of this license or (at your option) any +later version. The latest version of this license is in + http://www.latex-project.org/lppl.txt +and version 1.3 or later is part of all distributions +of LaTeX version 2005/12/01 or later. + +This work has the LPPL maintenance status `maintained'. + +The Current Maintainer of this work is Enrico Gregorio. + +This work consists of the files + gmp.dtx + gmp.ins +and the derived file gmp.sty. + +\endpreamble + +\generate{\file{gmp.sty}{\from{gmp.dtx}{package}}} + +\obeyspaces +\Msg{*************************************************************} +\Msg{* *} +\Msg{* To finish the installation you have to move the following *} +\Msg{* file into a directory searched by TeX: *} +\Msg{* *} +\Msg{* gmp.sty *} +\Msg{* *} +\Msg{* To produce the documentation run the file *} +\Msg{* gmp.dtx through LaTeX. *} +\Msg{* *} +\Msg{* Happy TeXing! *} +\Msg{* *} +\Msg{*************************************************************} + +\endbatchfile diff --git a/Master/texmf-dist/tex/latex/gmp/gmp.sty b/Master/texmf-dist/tex/latex/gmp/gmp.sty new file mode 100644 index 00000000000..b0afa6fdad3 --- /dev/null +++ b/Master/texmf-dist/tex/latex/gmp/gmp.sty @@ -0,0 +1,329 @@ +%% +%% This is file `gmp.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% gmp.dtx (with options: `package') +%% +%% This is a generated file. +%% +%% Copyright (C) 2011 by Enrico Gregorio +%% <Enrico dot Gregorio at univr dot it> +%% ------------------------------------------------------- +%% +%% This work may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either +%% version 1.3c of this license or (at your option) any +%% later version. The latest version of this license is in +%% http://www.latex-project.org/lppl.txt +%% and version 1.3 or later is part of all distributions +%% of LaTeX version 2005/12/01 or later. +%% +%% This work has the LPPL maintenance status `maintained'. +%% +%% The Current Maintainer of this work is Enrico Gregorio. +%% +%% This work consists of the files +%% gmp.dtx +%% gmp.ins +%% and the derived file gmp.sty. +%% +\NeedsTeXFormat{LaTeX2e}[2008/04/05] +\ProvidesPackage{gmp} + [2011/03/10 v1.0 Integrate MetaPost with LaTeX (EG)] +%%macro arguments: +%%#1 = desired width +%%#2 = desired height +%%#3 = pen thickness (relative) +%%#4 = line color +%%#5 = dot color +\@ifundefined{eTeXversion}{% + \PackageError{gmp}{This package requires a e-TeX extensions} + {The gmp package requires a modern TeX engine, please upgrade}% + \endinput}{} +\RequirePackage{xkeyval}[2005/01/30] + +\newif\ifgmp@latex % true if always using latex for mpx +\newif\ifgmp@locallatex % true if using latex for mpx for a + % single figure + +\newif\ifgmp@nogen % true if we are not generating the mps files +\newif\ifgmp@nowrite % true if we are not writing the mp files +\newif\ifgmp@warn % true if we are issuing the final message + +\DeclareOptionX<ggmp>{tex}{\def\gmp@mpxprogram{tex}% + \gmp@latexfalse\gmp@locallatexfalse} +\DeclareOptionX<ggmp>{latex}{\def\gmp@mpxprogram{latex}% + \gmp@latextrue\gmp@locallatextrue} + +\DeclareOptionX<ggmp>{noshellescape}{\gmp@nogentrue} +\DeclareOptionX<ggmp>{shellescape}{\gmp@nogenfalse} + +\DeclareOptionX<ggmp>{nowrite}{\gmp@nowritetrue} +\DeclareOptionX<ggmp>{write}{\gmp@nowritefalse} + +\DeclareOptionX<ggmp>{envname}{\def\gmp@envname{#1}} +\DeclareOptionX<ggmp>{extension}{\def\gmp@ext{#1}} + +\def\gmp@preoptions{} +\DeclareOptionX<ggmp>{everymp}{\edef\gmp@preoptions{\gmp@preoptions^^J#1}} + +\DeclareOptionX<ggmp>{clean}{\def\gmp@clean{#1}} + +\DeclareOptionX<ggmp>{rmcommand}{\def\gmp@remove{#1}} +\DeclareOptionX<ggmp>{postrmcommand}{\def\gmp@postremove{#1}} + +\def\gmp@jobname{\jobname} +\ExecuteOptionsX<ggmp>{tex,noshellescape,write,clean=none} +\ExecuteOptionsX<ggmp>{envname=mpost,extension=+mp, + rmcommand=rm -f,postrmcommand={}} +\ProcessOptionsX<ggmp>\relax +\RequirePackage{graphicx} +\RequirePackage{ifpdf} +\RequirePackage{ifxetex} +\RequirePackage{environ} +\ifxetex + \let\gmp@shellescape\shellescape + \def\gmp@preoptions{prologues:=3;^^J} +\else + \ifdefined\pdfshellescape % (pdf)latex + \let\gmp@shellescape\pdfshellescape + \else % lualatex + \chardef\gmp@shellescape=\z@ + \gmp@nogentrue + \fi +\fi +\def\gmp@msgdisallowed{\PackageWarningNoLine{gmp}{Compilation and + writing of MetaPost files has been\MessageBreak disallowed by the + `nowrite' option}\gdef\gmp@nemessage{}} +\def\gmp@msgnonexistent{\PackageWarning{gmp}{Non existent MetaPost + file requested}\ifgmp@warn\else\global\gmp@warntrue\fi} +\def\gmp@msgrequestx{\PackageWarningNoLine{gmp}{The MetaPost file you + requested does not exist,\MessageBreak perhaps by a compilation + error}} +\def\gmp@msgremember{\PackageWarningNoLine{gmp}{Remember to run `sh + \gmp@jobname\gmp@ext.sh' and rerun (pdf)LaTeX}} +\def\gmp@msgensure{% + \PackageWarningNoLine{gmp}{Ensure that you have enabled the shell + escape feature, or\MessageBreak you can be in trouble. The + available MetaPost generated\MessageBreak files will be used + anyway. Use option `nowrite' if they\MessageBreak are already + in final form}% + \let\gmp@message\@gobble + \let\gmp@writexviii\@gobble + \def\gmp@openout##1##2\@nil{}% + \let\gmp@write\@gobbletwo + \let\gmp@closeout\@gobble} +\let\gmp@message\message +\def\gmp@writexviii{\immediate\write18 } +\def\gmp@openout#1#2\@nil{\immediate\openout#1#2} +\def\gmp@write{\immediate\write} +\def\gmp@closeout{\immediate\closeout} +\def\gmp@setupmacros{% +\ifgmp@nowrite + \let\gmp@nemessage\gmp@msgdisallowed +\else + \ifgmp@nogen + \let\gmp@nemessage\gmp@msgnonexistent + \def\gmp@command{% + mpost \ifx\gmp@mpmem\empty\else\space\gmp@mpmem\space\fi}% + \newwrite\gmp@shellout + \immediate\openout\gmp@shellout=\gmp@jobname\gmp@ext.sh% + \immediate\write\gmp@shellout{\string##!/bin/sh}% + \def\gmp@shellcommand##1{\immediate\write\gmp@shellout{##1}}% + \AtEndDocument{\ifgmp@warn\gmp@msgremember\gmp@warnfalse\fi}% + \else + \let\gmp@nemessage\gmp@msgrequestx + \ifnum\gmp@shellescape=\@ne + \def\gmp@command{% + mpost -interaction=nonstopmode % + \ifx\gmp@mpmem\empty\else\space\gmp@mpmem\space\fi}% + \def\gmp@shellcommand##1{% + \gmp@message{^^J(gmp) Doing external command^^J(gmp) \string"}% + \gmp@writexviii{echo ##1'\string"'}\gmp@writexviii{##1}% + }% + \else + \gmp@msgensure\let\gmp@shellcommand\@gobble + \fi + \fi +\fi +} +\gmp@setupmacros +\def\gmpoptions#1{\setkeys{ggmp}{#1}\gmp@setupmacros} +\@onlypreamble\gmpoptions +\def\gmp@latexpreamble{%^^J% + \gmp@percent\string&latex^^J% + \string\documentclass[1\@ptsize pt]{article}^^J% + \ifx\empty\gmp@packages\else\the\gmp@packages^^J\fi% + \ifx\empty\gmp@commands\else\the\gmp@commands^^J\fi% + \string\begin{document}^^J} +\newcommand\usempxclass[2][]{% + \def\gmp@latexpreamble{^^J% + \gmp@percent\string&latex^^J% + \string\documentclass[#1]{#2}^^J% + \ifx\empty\gmp@packages\else\the\gmp@packages^^J\fi% + \ifx\empty\gmp@commands\else\the\gmp@commands^^J\fi% + \string\begin{document}^^J}} +\newtoks\gmp@packages +\newcommand\usempxpackage[2][]{% + \gmp@packages=\expandafter{\the\gmp@packages^^J% + \usepackage[#1]{#2}}} +\newcommand\resetmpxpackages{\gmp@packages={}} +\newtoks\gmp@commands +\newcommand\mpxcommands[1]{% + \gmp@commands=\expandafter{\the\gmp@commands^^J% + #1}} +\newcommand\resetmpxcommands{\gmp@commands={}} +\def\mpdim#1{ begingroup \the\dimexpr#1\relax\space endgroup } +\newwrite\gmp@out +\newcounter{gmp@count} +\AtEndDocument{% + \refstepcounter{gmp@count}% + \label{gmp@finallabel}% +} +\newenvironment{\gmp@envname}[1][] + {\@bsphack + \global\gmp@usefalse + \refstepcounter{gmp@count}\label{gmp@label@\thegmp@count}% + \bgroup + \edef\gmp@number{\thegmp@count}% + \gmp@grab{#1}} + {\@esphack} +\def\gmp@writeunex#1{\begingroup + \edef\x{\endgroup\noexpand\begin{\gmp@envname}[\the\toks@]% + \unexpanded{\unexpanded{#1}}\noexpand\end{\gmp@envname}}\x} +\newenvironment{\gmp@envname*}[1][] + {\toks@{#1}\Collect@Body\gmp@writeunex}{} +\def\gmp@fourdigits#1{% + \ifnum#1<10 0\fi + \ifnum#1<100 0\fi + \ifnum#1<1000 0\fi\number #1} +\def\gmp@not@a@name@{@not@a@name@} +\def\gmp@choosetex{\gmp@locallatexfalse} +\def\gmp@chooselatex{\gmp@locallatextrue} +\def\gmp@doiflatex#1{\ifgmp@latex#1\else\ifgmp@locallatex#1\fi\fi} +\def\gmp@mpmem{} +\newif\ifgmp@use +\define@key{gmp}{name}[@not@a@name@]{% + \def\gmp@thisname{#1}% + \expandafter\xdef\csname gmp@fig#1\endcsname + {\gmp@fourdigits{\gmp@number}}} +\define@key{gmp}{use}[true]{\global\csname gmp@use#1\endcsname} +\define@key{gmp}{mpmem}{\def\gmp@mpmem{-mem #1}} +\define@key{gmp}{mpsettings}{\edef\gmp@preoptions{\gmp@preoptions^^J#1}} +\define@key{gmp}{mpxcommands}{% + \gmp@commands=\expandafter{\the\gmp@commands^^J#1}} +\define@key{gmp}{mpxprogram}{% + \def\gmp@mpxprogram{#1}% + \csname gmp@choose#1\endcsname} +\define@key{gmp}{runs}{\chardef\gmp@runs=#1\relax} +\def\gmp@grab#1{% + \setkeys{gmp}{name}% + \setkeys{gmp}{runs=1}% + \setkeys{gmp}{#1}% + \ifx\gmp@thisname\gmp@not@a@name@ + \global\gmp@usetrue + \fi + \gmp@setup\gmp@innermpost} +\begingroup\@makeother\%\def\x{\endgroup\def\gmp@percent{%}}\x +\def\gmp@activesc{\catcode`\;=\active + \begingroup\lccode`\~=`\; + \lowercase{\endgroup\edef~}{\string;^^J}} +\def\gmp@otherchars{\do\!\do\=\do\:\do\"\do\?\do\'\do\`\do\|} +\def\gmp@setup{% + \let\do\@makeother\gmp@otherchars\newlinechar=`\^^J + \gmp@activesc + \def\par{^^J}% + \ifgmp@nowrite\else + \edef\@temp{\gmp@jobname\gmp@ext\gmp@fourdigits{\gmp@number}.mp}% + \expandafter\gmp@openout\expandafter\gmp@out\@temp\@nil + \gmp@write\gmp@out{% + \gmp@percent\gmp@percent\space + Do not edit, this file has been generated^^J% + \gmp@percent\gmp@percent\space + automatically by \jobname.tex via gmp.sty^^J^^J% + \gmp@doiflatex{verbatimtex\gmp@latexpreamble etex;^^J}% + \ifx\empty\gmp@preoptions\else\gmp@preoptions^^J\fi% + outputtemplate:= "\gmp@percent j.mps";^^J% + beginfig(\gmp@number);%^^J% + }% + \fi} +\long\def\gmp@innermpost#1\end#2{% + \ifgmp@nowrite\else + \gmp@write\gmp@out{% + #1^^Jendfig;^^Jend.% + \gmp@doiflatex{^^Jverbatimtex^^J\string\end{document}^^Jetex}}% + \gmp@closeout\gmp@out + \count@=\gmp@runs + \loop\ifnum\count@>\z@ + \gmp@shellcommand{\gmp@command\space + -tex=\gmp@mpxprogram\space\gmp@jobname\gmp@ext + \gmp@fourdigits{\gmp@number}}% + \advance\count@\m@ne + \repeat + \ifxetex + \gmp@shellcommand{epstopdf --hires \gmp@jobname\gmp@ext + \gmp@fourdigits{\gmp@number}.mps}% + \fi + \fi + \egroup + \end{#2}\ifgmp@use + \gmp@usempost{\thegmp@count}\fi} +\ifxetex + \def\gmp@usempost#1{% + \edef\gmp@thempsfile{\gmp@jobname\gmp@ext\gmp@fourdigits{#1}}% + \IfFileExists{\gmp@thempsfile.pdf}% + {\includegraphics{\gmp@thempsfile.pdf}}% + {\gmp@nemessage\gmp@box}} + \newcommand\usempost[2][]{% + \IfFileExists{\gmp@jobname\gmp@ext\csname gmp@fig#2\endcsname.pdf}% + {\includegraphics[#1] + {\gmp@jobname\gmp@ext\csname gmp@fig#2\endcsname.pdf}}% + {\gmp@nemessage\gmp@box}} +\else + \def\gmp@usempost#1{% + \edef\gmp@thempsfile{\gmp@jobname\gmp@ext\gmp@fourdigits{#1}}% + \IfFileExists{\gmp@thempsfile.mps}% + {\includegraphics[hiresbb]{\gmp@thempsfile.mps}}% + {\gmp@nemessage\gmp@box}} +\newcommand\usempost[2][]{% + \IfFileExists{\gmp@jobname\gmp@ext\csname gmp@fig#2\endcsname.mps}% + {\includegraphics[hiresbb,#1] + {\gmp@jobname\gmp@ext\csname gmp@fig#2\endcsname.mps}}% + {\gmp@nemessage\gmp@box}} +\fi +\def\gmp@box{\fbox{\@ifundefined{color}{}{\color{red}}MP}} +\AtEndDocument{% + \@ifundefined{gmp@doclean@\gmp@clean} + {\expandafter\gmp@badcleaning\expandafter{\gmp@clean}} + {\@nameuse{gmp@doclean@\gmp@clean}}} +\def\gmp@badcleaning#1{\PackageWarningNoLine{gmp}{% + Wrong cleaning option `clean=#1'; `clean=none' used}} +\def\gmp@doclean@none{} +\def\gmp@doclean@aux{% + \gmp@shellcommand{\gmp@remove\space + \jobname\gmp@ext*.log\space\gmp@postremove}% + \gmp@shellcommand{\gmp@remove\space + \jobname\gmp@ext*.mpx\space\gmp@postremove}% + \gmp@shellcommand{\gmp@remove\space + \jobname\gmp@ext*.mpo\space\gmp@postremove}% + } +\def\gmp@doclean@mp{% + \gmp@shellcommand{\gmp@remove\space + \jobname\gmp@ext*.log\space\gmp@postremove}% + \gmp@shellcommand{\gmp@remove\space + \jobname\gmp@ext*.mpx\space\gmp@postremove}% + \gmp@shellcommand{\gmp@remove\space + \jobname\gmp@ext*.mpo\space\gmp@postremove}% + \gmp@shellcommand{\gmp@remove\space + \jobname\gmp@ext*.mp\space\gmp@postremove}% + \ifxetex + \gmp@shellcommand{\gmp@remove\space + \jobname\gmp@ext*.mps\space\gmp@postremove}% + \fi} +\long\def\verbatimtex#1etex{verbatimtex \unexpanded{#1} etex} +\long\def\btex#1etex{btex \unexpanded{#1} etex} +\endinput +%% +%% End of file `gmp.sty'. |