% \iffalse meta-comment
%
% Copyright (C) 2005-2015 by Enrico Gregorio 
% <Enrico dot Gregorio at univr dot it>
% -------------------------------------------------------
% 
% This file may be distributed and/or modified under the conditions of
% the LaTeX Project Public License, either version 1.2 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.2 or later is part of all distributions of LaTeX
% version 1999/12/01 or later.
%
% \fi
%
% \iffalse
%<*driver>
\ProvidesFile{abc.dtx}
%</driver>
%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<package>\ProvidesPackage{abc}
%<*package>
  [2016/05/15 v2.0b Enrico Gregorio]
%</package>
%<*driver>
\documentclass{ltxdoc}
\usepackage{verbatim}
\newenvironment{smallverb}{\footnotesize\verbatim}{\endverbatim}
\EnableCrossrefs         
\CodelineIndex
\RecordChanges
\begin{document}
  \DocInput{abc.dtx}
\end{document}
%</driver>
% \fi
%
% \CheckSum{416}
%
% \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{v2.0b}{2016/05/15}{Use shellesc}
%
% \changes{v2.0a}{2015/09/09}{Fixed gobbling of leading lines that
% start with \%}
%
% \changes{v2.0}{2008/03/03}{Many changes, in order to allow for Mup 
% support; added saveall and nosaveall options}
%
% \changes{v1.1}{2007/03/27}{Added \cs{endgroup} when the warning for 
% a non existent file is issued}
% 
% \changes{v1.0}{2006/03/22}{After long delay decided to publish it}
%
% \changes{v0.7}{2005/11/21}{Corrected some errors from previous 
% version; changed `abcinput' to support keyword-value pairs like 
% the environment; added the production of a batch file when the 
% `noshellescape' option is active; improved the documentation}
% 
% \changes{v0.7beta}{2005/11/19}{Added the `postoptions' and `width' 
% keywords}
% 
% \changes{v0.6}{2005/11/18}{Changed options: erased `nix' and
% `dos', added `ps2epsidos' to correct a mistake}
% 
% \changes{v0.5}{2005/11/13}{Added the interface to keyval}
% 
% \changes{v0.4}{2005/11/10}{Initial version; too many things changed}
% 
% \changes{v.0.1-0.3}{2005/11/01}{Very preliminar versions}
%
% \GetFileInfo{abc.dtx}
%
% \DoNotIndex{\newcommand,\newenvironment,\def,\ifpdf,\begin}
% \DoNotIndex{\DeclareOption,\ExecuteOptions,\RequirePackage}
% \DoNotIndex{\renewcommand,\else,\fi,\relax,\@bsphack,\@esphack}
% \DoNotIndex{\active,\AtEndOfPackage,\catcode,\centering}
% \DoNotIndex{\closeout,\comment,\do,\dospecials,\end,\endcomment}
% \DoNotIndex{\fbox,\gdef,\immediate,\includegraphics,\let}
% \DoNotIndex{\linewidth,\message,\newif,\newwrite,\openout}
% \DoNotIndex{\PackageWarning,\space,\the,\verbatim@line}
% \DoNotIndex{\verbatim@processline,\verbatim@start,\write}
% \DoNotIndex{\@makeother,\IfFileExists,\ProcessOptions}
% \DoNotIndex{\@ifnextchar,\define@key,\MessageBreak,\setkeys}
% \DoNotIndex{\stepcounter,\newcounter,\trivlist,\AtEndDocument}
% \DoNotIndex{\@empty,\edef,\csname,\endcsname,\edef,\begingroup}
% \DoNotIndex{\endgroup,\endtrivlist,\global,\if,\ifx,\item}
% \DoNotIndex{\PackageWarningNoLine,\PassOptionsToPackage}
% \DoNotIndex{\ProvidesPackage,\@arabic}
%
% \title{The \textsf{abc} package\thanks{This document corresponds to
% \textsf{abc}~\fileversion, dated \filedate.}}
%   
% \author{Enrico Gregorio \\ \texttt{Enrico dot Gregorio at univr dot it}}
% 
% \date{\filedate}
%
% \maketitle
%
% \section{Introduction}
% There are several ways to set music using \TeX{}, notably
% Musix\TeX{} and Lilypond.  Both are very powerful and, 
% consequently, a bit difficult to learn and to use.
% 
% From the point of view of notation, the ABC
% system\footnote{\texttt{http://staffweb.cms.gre.ac.uk/\char`\~c.walshaw/abc/}}
% is much simpler.  A recent extension of this language, called
% ABC~Plus\footnote{\texttt{http://abcplus.sourceforge.net}}, allows
% for setting multiple staves and polyphony.  One of the best programs
% for converting these notations into sheet music is
% \texttt{abcm2ps}, which can take an ABC or ABC~Plus file and
% transform it into a PostScript\texttrademark{} file.
% 
% The purpose of this package is to allow \LaTeX{} users to include in
% their documents small excerpts of music written directly in
% ABC (Plus).  It exploits the \verb|\write18| technique available with
% the Web2C implementation of the \TeX{} system and free utilities 
% like \texttt{ps2eps}, \texttt{ps2epsi} and \texttt{epstopdf}. From
% version 2.0b we check the existence of the \textsf{shellesc} package
% in order to be compatible with Lua\TeX.
% 
% This package can be used both with \LaTeX{} and
% \textsc{pdf}\LaTeX{}, without any change in the user's source file.
% It employs also the package \textsf{keyval} by David Carlisle and
% ideas from the \textsf{verbatim} package in the \LaTeX{} tools.
% 
% Martin Tarenskeen wrote me about possible support of Mup--Music
% Publisher\footnote{\texttt{http://www.arkkra.com}} and actually it
% was easy to add it along with some improvements partly suggested by
% him.  Therefore the package now comes along with a new \textsf{mup}
% package; see section~\ref{mup}.  I owe many thanks to Martin for
% testing the new version.
% 
% We are studying whether it is feasible to extend support also to
% other music printing programs like Lilypond.
%
% \section{Usage}
% \DescribeEnv{abc}
% The only environment provided by this package is \verb|abc| with 
% the following syntax:
% \begin{quote}
% \verb|\begin{abc}[|\meta{keyword}$=$\meta{value}\verb|...]|\\
% \meta{ABC Plus material}\\
% \verb|\end{abc}|
% \end{quote}
% The environment should be used only in LR-mode.  Its output is set
% in a `center' environment.  We give a list of the available
% keywords.
% \begin{description}
%
% \item[\normalfont\texttt{name=}\meta{name}:] \meta{name} is a name
% for the temporary file which will be output and massaged by
% \texttt{abcm2ps}. \emph{Warning}: the extension \texttt{.abc} is 
% automatically added to the file name; esistent files with the same 
% name will be silently erased. If the keyword is specified without a 
% value, then the output file receives a unique name.
%
% \item[\normalfont\texttt{options=}\meta{options}:] \meta{options}
% are command line parameters to the \texttt{abcm2ps} utility; the
% default are `\texttt{-O= -c}'.
%
% \item[\normalfont\texttt{postoptions=}\meta{postoptions}:]
% \meta{postoptions} are possible command line options which, in
% \texttt{abcm2ps} syntax, go after the file name.
% 
% \item[\normalfont\texttt{program=}\meta{program}:] \meta{program} is
% used to specify an alternative program to \texttt{abc2mps} (if
% existent).  In this case users must specify completely the command
% line options, directly in \meta{program} or with \meta{options} and
% \meta{postoptions}.  For example
% \begin{quote}
% \verb|\begin[name=song,program=abctoeps,options={-a -b}]|\\
% \verb|\begin[name=song,program={abc3ps -a -b}]|
% \end{quote}
% (assuming there is an \texttt{abc3ps} program).
% 
% \item[\normalfont\texttt{width=}\meta{width}:] \meta{width} should 
% be a dimension; it is best to express it as a fraction of 
% \verb|\abcwidth|.
% 
% \item[\normalfont\texttt{center}:] This is a boolean, either true 
% or false; the default is true, if left flush alignment is preferred,
% specify \texttt{center=false}.
% 
% \item[\normalfont\texttt{extension}:] This keyword seems practically 
% useless, but is needed if one needs to input both ABC and Mup files 
% in one and the same document. See later on.
% \end{description}
% 
% \DescribeMacro{\abcinput}
% It is also possible to input an available ABC file. The syntax is
% \begin{quote}
% \verb|\abcinput|\oarg{options}\marg{name}
% \end{quote}
% where \meta{name} is the name of the file, without the extension 
% which should be \texttt{.abc}. In the optional argument users can 
% put keyword-value pairs as for the environment. Of course the 
% keyword \texttt{name} is ignored here.
% 
% \DescribeMacro{\abcwidth}
% Users have a minimum control (at least in this version) on how to
% include some lines of music. The only parameter they can modify is 
% \verb|\abcwidth| with \verb|\renewcommand|. Its normal value is 
% \verb|\linewidth|. The best thing to do is
% \begin{quote}
% \verb|\renewcommand{\abcwidth}{|\meta{fraction}\verb|\linewidth}|
% \end{quote}
% where \meta{fraction} is some number between $0$ and~$1$.  Changing
% this parameter affects every subsequent music inclusion, obeying to
% the usual scoping rules. The width can be changed locally for the 
% environment or the command with the method explained before.
% 
% \DescribeMacro{\normalabcoutputfile}
% The name for the generic output files is ``\texttt{out-abc}''.  In
% the (improbable) case that some file \texttt{out-abc.}\meta{ext} is
% present in the directory, users can redefine
% \verb|\normalabcoutputfile| as they like.
% 
% \section{Package options}
% There are some package options, to control what is to be passed for 
% subsequent processing.
% 
% \subsection{\texttt{shellescape} and \texttt{noshellescape}}
% The option \texttt{shellescape} (default) means that some external
% programs will be called by \LaTeX{} to get the inclusion of the
% music lines.  If you don't trust the automatic generation, or your
% \TeX{} implementation does not allow the trick with \verb|\write18|,
% then use \texttt{noshellescape}.  In this case, a name should be
% specified for every `abc' environment, because otherwise ABC output
% files will be overwritten, since they receive the same generic name,
% by default. A file named \texttt{out-abc.sh} is produced, 
% containing the commands to give for elaborating the music files.
% 
% \subsection{\texttt{generate} and \texttt{nogenerate}}
% With the \texttt{generate} option (default) the ABC lines will be
% processed by the external programs.  The \texttt{nogenerate} option
% can be used when the ABC sources have not changed, in order to
% increase speed.  Also in this case, however, a name should be
% specified for all output ABC files.
% 
% \subsection{\texttt{ps2epsi}, \texttt{ps2epsidos} and
% \texttt{ps2eps}}
% The option \texttt{ps2eps} (default) means that the \texttt{ps2eps}
% Perl script will be used for generating the EPS file for graphic
% inclusion.  Specify the \texttt{ps2epsi} option if you prefer the
% \texttt{ps2epsi} program; specify \texttt{ps2epsidos} if you are on
% a system where the utility \texttt{ps2epsi} generates a file with
% three letter extension \texttt{.epi}.
% 
% \subsection{\texttt{nosaveall} and \texttt{saveall}}
% The first is the default, but the second is called implicitly when
% the \texttt{noshellescape} is given.  When the \texttt{saveall}
% option is active, every `abc' environment produces a unique output
% file; in other words, the \texttt{name} keyword, without value, is
% given for every environment.  So the \texttt{noshellescape} option
% along with \texttt{generate} will not overwrite the output from
% unnamed environment. It is possible that, during the document's 
% preparation, the numbers added to the default file name are out of 
% synch, the process should converge. Note that with Lua\TeX{} the
% \texttt{nosaveall} option can produce errors, so \texttt{saveall} is
% enabled by default, with this engine.
% 
% 
% \section{Compiling documents}
% Users must give the option \texttt{-shell-escape} when compiling 
% their documents, unless they chose the \texttt{nogenerate} package 
% option or the \texttt{noshellescape}. Thus one of
% \begin{quote}
% \texttt{latex -shell-escape} \meta{\TeX{} file name}\\
% \texttt{pdflatex -shell-escape} \meta{\TeX{} file name}\\
% \texttt{simpdftex latex --extratexopts "-shell-escape"}
% \end{quote}
% should be used from the command line (or equivalent way, depending
% on operating system and distribution).
% 
% \section{An example file}
% \iffalse
%<*example>
% \fi
% \begin{smallverb}
\documentclass[a4paper,12pt]{article}
\usepackage[generate,ps2eps]{abc}
\usepackage{mathptmx}

\begin{document}

\title{Example of ABC Plus in \LaTeX{}}
\author{Guido Gonzato}
\date{}
\maketitle

This is a short piece.

\medskip

\begin{abc}
X:4
T:Cronin's Hornpipe
R:hornpipe
S:Keenan and Glackin
E:7
M:C|
L:1/8
K:G
BA|GABc dBde|gage dega|bage dBGB|cABG A2BA|!
GABc dBde|gage dega|bage dBAB|G2G2 G2:|!
fg|afd^c d2ga|bged e2ga|(3bag  (3agf gedB|(3cBA AG AcBA|!
GABc dBde|~g3e dega|bage dBAB|G2G2 G2:|!
\end{abc}

\medskip

This is another short piece, but we would like to keep the
ABC source in our directory.

\begin{abc}[name=jacky]
X:9
T:Jacky Tar
R:hornpipe
M:4/4
L:1/8
K:Edor
(Bd) | "Em"  e2 ed efge | "G" d2 B2 B2 (dB) | "D" ABde faef |  d2 A2 A2 (Bd) |
       "Em" e2 ef g2 fe | "G" dB GB d2 (cB) | "D" AGFE DEFA | "Em" G2 E2 E2  :|
(GA) | "Em" BGEG   BGEG |     BAGF  E2 (FG) | "D" BGEG BGEG |   AGFE D2 (EF) |
       "G" GFGB g2 (fe) |     dBGB  d2 (cB) | "D" AGFE DEFA | "Em" G2 E2 E2  :|
\end{abc}

\clearpage

And, finally, we want to set also the last piece; its ABC code
is already in our directory.

\medskip

\abcinput{poll}

\end{document}
% \end{smallverb}
% \iffalse
%</example>
% \fi
% 
% This file is accompanied by a file \texttt{poll.abc}
% \iffalse
%<*abc>
% \fi
% \begin{smallverb}
X:12
T:Poll Ha'penny
T:Garra\'i na bhF\'eile\'og
R:hornpipe
H:The Irish title means "The Garden of Honeysuckles"
D:Mary Bergin: Feadoga Stain
D:Noel Hill agus Tony McMahon: I gCnoc na Grai
Z:id:hn-hornpipe-26
M:C|
L:1/8
K:Amix
(3GAB | =cAAG A2 (3AB=c | (3d=cB (3AGF G2 (3B^cd | ed^cA    d^cAG | ~A3 G A2 de |
        ~f3 d     ~e3 c | d2     (3Bcd      efge | aged (3=cBA GB | ~A3 G     A2:|
|: ef | ~g3 f      gfef | g2 ga             gedg | eaag      a3 g | eaag  a2 ag |
        ~f3 d     ~e3 c | d2     (3Bcd      efge | aged (3=cBA GB | ~A3 G    A2 :| 
% \end{smallverb}
% \iffalse
%</abc>
% \fi
% 
% \section{Mup support}\label{mup}
% Everything we have said about ABC translates verbatim for Mup. 
% Simply call the package with
% \iffalse
%<*verb>
% \fi
\begin{verbatim}
\usepackage{mup}
\end{verbatim}
% \iffalse
%</verb>
% \fi

% with options just like before, and substitute the string `mup' to
% every occurrence of `abc' in the preceding sections.  The only
% differences are in the default command line options when calling the
% external program (they are \texttt{-F} for `mup').
% 
% It is even possible to use both external programs in the same 
% document. If this is desired, call the \textsf{abc} package and 
% define a new environment for Mup inclusion as follows
% \iffalse
%<*verb>
% \fi
\begin{verbatim}
\newenvironment{mup}[1][]
  {\renewcommand{\normalabcoutputfile}{out-mup}%
   \abc[program=mup,options={-F},extension=mup,#1]}
  {\endabc}
\newcommand{\mupinput}[2][]{%
  \abcinput[program=mup,options={-F},extension=mup,#1]{#2}}
\end{verbatim}
% \iffalse
%</verb>
% \fi
% 
% Here is an example with Mup.
% 
% \iffalse
%<*example-mup>
% \fi
% \begin{smallverb}
\documentclass[a4paper,12pt]{article}
\usepackage[generate,ps2eps]{mup}
\usepackage{mathptmx}

\begin{document}

\title{Example of MUP in \LaTeX{}}
\author{Martin Tarenskeen}
\date{}
\maketitle

This is a short piece.

\medskip

\begin{mup}
1: a-;b-;c;d;
bar
1: e;f;g;a;
endbar
\end{mup}

\medskip

This is another short piece, but we would like to keep the
MUP source in our directory.

\begin{mup}[name=mymup]
score
staffs=2
time=6/8
beamstyle=4.,4.

staff 2
clef=bass

music
1: 8c;d;e;f;g;a;
2: 4.ceg;cfa;
repeatend

\end{mup}

\clearpage

And finally, we want to set also the last piece; its MUP code
is already in our directory.

\medskip

\mupinput{simple}

\end{document}
% \end{smallverb}
% \iffalse
%</example-mup>
% \fi
% This file is accompanied by a file \texttt{simple.mup}
% \iffalse
%<*mup>
% \fi
% \begin{smallverb}
score
staffs=2
time=6/8
beamstyle=4.,4.

staff 2
clef=bass

music
1: 8c;d;e;f;g;a;
2: 4.ceg;cfa;
repeatend
% \end{smallverb}
% \iffalse
%</mup>
% \fi
%
% \StopEventually{\PrintChanges\PrintIndex}
%
% \section{The implementation}
% After the usual stuff of package presentation, here are the actual
% macros.  To begin with the option declarations and the defaults.
% The first options are boolean.
%    \begin{macrocode}
%<*package>
\RequirePackage{ifluatex}
\newif\ifabc@shellescape
\newif\ifabc@generate
\newif\ifabc@warning
\newif\ifabc@saveall
\newif\ifabc@mup
\DeclareOption{mup}{\abc@muptrue}
\DeclareOption{noshellescape}{\abc@shellescapefalse\abc@warningtrue
  \abc@savealltrue}
\DeclareOption{shellescape}{\abc@shellescapetrue}
\DeclareOption{nogenerate}{\abc@generatefalse}
\DeclareOption{generate}{\abc@generatetrue}
\DeclareOption{nosaveall}{\abc@saveallfalse}
\DeclareOption{saveall}{\abc@savealltrue}
%    \end{macrocode}
% The following options control the external programs to use.
%    \begin{macrocode}
\def\abc@epsext{eps}
\DeclareOption{ps2eps}{\def\abc@pscmd{ps2eps -f}}
\DeclareOption{ps2epsi}{\def\abc@pscmd{ps2epsi}\def\abc@epsext{epsi}}
\DeclareOption{ps2epsidos}{\def\abc@pscmd{ps2epsi}\def\abc@epsext{epi}}
%    \end{macrocode}
% Now we declare the default options and call the user specified
% ones. Since Lua\TeX{} doesn't accept loading different PDF files
% with the same name, when this engine is used, the \texttt{saveall}
% option is enabled by default.
%    \begin{macrocode}
\ExecuteOptions{generate,shellescape,nosaveall,ps2eps}
\ifluatex
  \ExecuteOptions{saveall}
\fi
\ProcessOptions\relax
%    \end{macrocode}
% 
% Then we have to load some packages we need.  The first one is to do
% verbatim output to a file without reinventing the wheel.  Then the
% package for implementing keyword-value options; we have to take care
% of graphics inclusion, and to control whether we are using \LaTeX{}
% with DVI or PDF output.
%    \begin{macrocode}
\RequirePackage{verbatim}
\RequirePackage{keyval}
\RequirePackage{graphicx}
\RequirePackage{ifpdf}
%    \end{macrocode}
% Next we define some internal commands. First of all a boolean for 
% issuing messages if necessary and a counter to assign unique names 
% to output files
%    \begin{macrocode}
\newif\ifabc@unprocessedfiles
\newcounter{abc@count}
%    \end{macrocode}
% We choose to give explicitly the extensions to the graphics files,
% since some user could prefer \texttt{ps2epsi}. Everything is 
% doubled for Mup support.
% \begin{environment}{mup}
% \begin{macro}{\mupinput}
%    \begin{macrocode}
\ifabc@mup
\newcommand{\abc@cmd}{mup}       % virtually no choice
\newcommand{\abc@parm}{-F}       % -F MUST stay
\newcommand{\abc@epstopdfcmd}{epstopdf}
\newcommand{\abc@pdfext}{pdf}
\def\normalabcoutputfile{out-mup}
\def\normalmupoutputfile{\normalabcoutputfile}
\def\mup{\abc}
\def\endmup{\endabc}
\def\mupinput{\abcinput}
\def\abc@ext{.mup}
\def\abc@packagename{mup}
\else
\newcommand{\abc@cmd}{abcm2ps}       % virtually no choice
\newcommand{\abc@parm}{-O= -c}       % -O= MUST stay
\newcommand{\abc@epstopdfcmd}{epstopdf}
\newcommand{\abc@pdfext}{pdf}
\def\normalabcoutputfile{out-abc}
\def\abc@ext{.abc}
\def\abc@packagename{abc}
\fi
\def\abc@tempfile{\normalabcoutputfile}
\def\abc@opt{}
\let\abc@postopt\@empty
\ifpdf
  \let\abc@finalext\abc@pdfext
\else
  \let\abc@finalext\abc@epsext
\fi
\newif\ifabc@center
\abc@centertrue
%    \end{macrocode}
% \end{macro}
% \end{environment}
% The following is the only parameter the user is authorized to 
% tamper with; it has an alias for Mup.
%    \begin{macrocode}
\newcommand{\abcwidth}{\linewidth}  % only fractions of \linewidth
\let\mupwidth\abcwidth
%    \end{macrocode}
% \begin{macro}{\abc@startgen}
% \begin{macro}{\abc@finishgen}
% Now something directly borrowed from the package \textsf{verbatim}.
% We declare an output stream and define two macros which will be
% called by the \texttt{abc} environment or by the \verb|\abcinput|
% command in case we are generating the graphics files. The macro 
% \verb|\abc@startgen| then passes the control to \verb|\abc@process| 
% which is different, according to the options given to the package.
%    \begin{macrocode}
\newwrite\abc@out
\def\abc@startgen{%
  \@bsphack
  \immediate\openout\abc@out\abc@tempfile\abc@ext
  \let\do\@makeother\dospecials
  \catcode`\^^M\active \catcode`\^^I=12
  \def\verbatim@processline{%
  \immediate\write\abc@out
    {\the\verbatim@line}}%
  \verbatim@start}
\def\abc@finishgen{%
  \immediate\closeout\abc@out
  \@esphack
  \abc@process
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \begin{macro}{\abc@doshellcommand}
% \begin{macro}{\abc@nodoshellcommand}
% We define a macro for the external massaging of the ABC files and
% another one for the case the user doesn't trust or have available
% the \verb|\write18| trick; the second one spits out a very simple
% shell script which can be used to take care of the compilation; this
% file is probably compatible with all systems having a command line
% interface.  Then we check the options again and define the commands
% that really do the job.
%    \begin{macrocode}
\ifluatex
  \IfFileExists{shellesc.sty}
    {\RequirePackage{shellesc}\let\abc@shell\ShellEscape}
    {\def\abc@shell{\immediate\write18}}
\else
  \def\abc@shell{\immediate\write18}
\fi
\def\abc@doshellcommand{%
  \abc@shell{%
    \ifabc@mup
      \abc@cmd\space
      \abc@opt\space
      \abc@parm\space
      \abc@tempfile\abc@ext\space
    \else
      \abc@cmd\space
      \abc@parm\space
      \abc@opt\space
      \abc@tempfile\abc@ext\space
    \fi
    \ifx\abc@postopt\@empty
    \else\space\abc@postopt\fi
  }%
  \abc@shell{%
    \abc@pscmd\space\abc@tempfile.ps
  }%
  \ifpdf
    \abc@shell{%
      \abc@epstopdfcmd\space\abc@tempfile.\abc@epsext
    }%
  \fi
}
\def\abc@nodoshellcommand{%
\immediate\write\abc@outsh{%
  \abc@cmd\space
  \abc@parm\space
  \abc@opt\space
  \abc@tempfile\abc@ext\space
  \ifx\abc@postopt\@empty
  \else\space\abc@postopt\fi}%
\immediate\write\abc@outsh{%
  \abc@pscmd\space\abc@tempfile.ps}%
\ifpdf
  \immediate\write\abc@outsh{%
    \abc@epstopdfcmd\space\abc@tempfile.\abc@epsext}%
\fi
  }
%    \end{macrocode}
% We use a conditional to emit a message at the end of the
% compilation if some file has not been found and the 
% \texttt{nogenerate} option was chosen.
%    \begin{macrocode}
\AtEndDocument{%
  \ifabc@warning\ifabc@unprocessedfiles
    \PackageWarningNoLine{\abc@packagename}{%
      \ifabc@shellescape
        You have set the `shellescape' option, but you ran%
        \MessageBreak
        (pdf)latex without the `-shell-escape' command line%
        \MessageBreak
        option. Fix it either with the `noshellescape' option%
        \MessageBreak
        in your document or the correct call of (pdf)latex%
      \else
        Remember to generate the [eps,pdf] files before compiling%
        \MessageBreak
       again. Use the file \abc@tempfile.sh for a list or as a script%
      \fi}%
  \fi\fi}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% Now we define the macro responsible for the massaging of the ABC 
% files. This is a good moment for inizializing the writing of the 
% shell script, when needed.
% \begin{macro}{\abc@process}
%    \begin{macrocode}
\ifabc@shellescape
  \let\abc@process\abc@doshellcommand
\else
  \newwrite\abc@outsh
  \immediate\openout\abc@outsh\abc@tempfile.sh
  \AtEndDocument{\closeout\abc@outsh}
  \let\abc@process\abc@nodoshellcommand
\fi
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\abc@start}
% \begin{macro}{\abc@finish}
% We now define how to start and finish; if no generation is required,
% the ABC lines are skipped like a comment (thanks again to the
% \textsf{verbatim} package).
%    \begin{macrocode}
\ifabc@generate
  \let\abc@start\abc@startgen
  \let\abc@finish\abc@finishgen
\else
  \let\abc@start\comment
  \let\abc@finish\endcomment
\fi
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \begin{environment}{abc}
% \begin{macro}{\abcinput}
% Finally, we define the environment and the command. Some commands 
% are initialized here; the name of the temporary file is, by default,
% ``out-abc'' which should not clobber any existing file.
%    \begin{macrocode}
\def\abc{\@makeother\%\@ifnextchar[\abc@grab{\abc@grab[]}}
\define@key{abc}{name}[]{%
  \if!#1!\stepcounter{abc@count}%
    \edef\abc@tempfile{\normalabcoutputfile-\@arabic\c@abc@count}%
  \else
    \def\abc@tempfile{#1}%
  \fi
}
\define@key{abc}{options}{\def\abc@opt{#1}}
\define@key{abc}{postoptions}{\def\abc@postopt{#1}}
\define@key{abc}{program}{\def\abc@cmd{#1}\let\abc@parm\@empty}
\define@key{abc}{width}{\def\abc@width{#1}}
\define@key{abc}{center}[true]{\csname abc@center#1\endcsname}
\define@key{abc}{extension}{\def\abc@ext{.#1}}
\def\abc@grab[#1]{\let\abc@width=\abcwidth
  \ifabc@saveall
    \setkeys{abc}{name,#1}%
  \else
    \setkeys{abc}{#1}%
  \fi\abc@start}
%    \end{macrocode}
% The final part of the environment; we do the processing, if 
% required and then include the graphics file. If none is found, the 
% simple name is used, to recall that some processing is to be done.
%    \begin{macrocode}
\def\endabc{%
  \abc@finish
  \trivlist\item[]\ifabc@center\centering\fi
  \IfFileExists{\abc@tempfile.\abc@finalext}
    {\includegraphics[width=\abc@width]{\abc@tempfile.\abc@finalext}}%
    {\global\abc@warningtrue\fbox{\abc@tempfile}%
     \global\abc@unprocessedfilestrue}%
  \endtrivlist
}
%    \end{macrocode}
% The command version is similar. The only difference is that we 
% issue a warning if the named file does not exist.
%    \begin{macrocode}
\def\abcinput{\@ifnextchar[\abc@grabinput{\abc@grabinput[]}}
\def\abc@grabinput[#1]#2{\let\abc@width=\abcwidth\setkeys{abc}{#1}%
  \begingroup\def\abc@tempfile{#2}%
  \IfFileExists{\abc@tempfile\abc@ext}
  {%
    \abc@process
    \begin{center}
    \IfFileExists{\abc@tempfile.\abc@finalext}
      {\includegraphics[width=\abc@width]{\abc@tempfile.\abc@finalext}}%
      {\fbox{\abc@tempfile}}%
    \end{center}%
  \endgroup
  }
  {\PackageWarning{\abc@packagename}{No file \abc@tempfile\abc@ext\space found}}%
}
%</package>
%    \end{macrocode}
% \end{macro}
% \end{environment}
%    \begin{macrocode}
%<*package-mup>
\ProvidesPackage{mup}
\DeclareOption*{\PassOptionsToPackage{\CurrentOption}{abc}}
\ProcessOptions\relax
\RequirePackage[mup]{abc}
%</package-mup>
%    \end{macrocode}
% \Finale
