% \iffalse
%
%<*internal>
\begingroup
%</internal>
%<*batchfile>
\input docstrip.tex
\keepsilent
\preamble
____________________________
The ASYMPTOTE package
(C) 2003 Tom Prince
(C) 2003-2021 John Bowman
(C) 2010 Will Robertson
Adapted from comment.sty
Licence: GPL2+
\endpreamble
\nopostamble
\askforoverwritefalse
\generate{\file{asymptote.sty}{\from{\jobname.dtx}{pkg}}}
%</batchfile>
%<batchfile>\endbatchfile
%<*internal>
\generate{\file{\jobname.ins}{\from{\jobname.dtx}{batchfile}}}
\edef\tmpa{plain}
\ifx\tmpa\fmtname\endgroup\expandafter\bye\fi
\endgroup
\immediate\write18{makeindex -s gind.ist -o \jobname.ind \jobname.idx}
\immediate\write18{makeindex -s gglo.ist -o \jobname.gls \jobname.glo}
%</internal>
%
%<*driver>
\ProvidesFile{asy-latex.dtx}
%</driver>
%<pkg>\ProvidesPackage{asymptote}
%<*pkg>
[2024/02/26 v1.38 Asymptote style file for LaTeX]
%</pkg>
%
%<*driver>
\documentclass{ltxdoc}
\EnableCrossrefs
\CodelineIndex
\begin{document}
\DocInput{\jobname.dtx}
\end{document}
%</driver>
% \fi
%
% \GetFileInfo{asy-latex.dtx}
% \title{The \textsf{asymptote} package}
% \author{%
% John Bowman, Tom Prince, and Will Robertson
% }
% \date{\filedate\qquad\fileversion}
% \maketitle
% \begin{abstract}
% This package provides integration of inline and external Asymptote
% graphics within a \LaTeX\ document.
% \end{abstract}
%
% \tableofcontents
%
% \section{Introduction}
%
% This is the documentation for the \LaTeX\ package \texttt{asymptote}
% which accompanies the Asymptote drawing package. For further details on
% Asymptote, please see its documentation in \texttt{asymptote.pdf}.
%
% \section{User syntax}
%
% \subsection{Package loading and options}
%
% The package may take two options at load time: \texttt{inline} or
% \texttt{attach}.
% These options can also be set at any time with the
% \cmd\asysetup\marg{options} command, or specified individually in the
% optional argument to each \texttt{asy} environment or \texttt{asyinclude}
% command.
%
% The \texttt{inline} option uses Asymptote's `inline' mode whereby
% included graphics have their labels typeset in the environment of the
% document they are contained within. Otherwise the Asymptote graphics are
% self-contained and their formatting is independent of the document.
%
% The \texttt{attach} option allows generated graphics to be embedded
% within the PDF using the \texttt{attachfile2} package; please load that
% package separately if you wish to use it. The \texttt{attach} option
% takes precedence over the \texttt{inline} option.
%
% This package produces quite a number of output files, which by default
% are created in the same directory as the \LaTeX\ document that is being
% compiled. To keep things more tidy, you can specify an output directory
% for these files by defining the \cmd\asydir\ command. For example, if you
% wish to store the figure files in the subdirectory \texttt{asytmp/}, the
% you would write \verb|\renewcommand\asydir{asytmp}|.
%
% Alternatively (and tentatively), you may write \verb|dir=asytmp| in
% either the \texttt{asy} environment options or the options to
% \cmd\asysetup.
%
% \subsection{Commands for inserting Asymptote graphics}
%
% The main environment defined by the package is the \texttt{asy}
% environment, in which verbatim Asymptote code is placed that will be
% compiled for generating a graphic in the document. For example,
% \begin{verbatim}
% \begin{figure}
% \begin{asy}[ <options> ]
% <ASYMPTOTE CODE>
% \end{asy}
% \caption{...}\label{...}
% \end{verbatim}
%
% If you have Asymptote code in a separate file, you can include it with
% the \cmd\asyinclude\oarg{options}\marg{filename}\ command.
%
% For Asymptote code that should be included in \emph{every} graphic,
% define it using the \texttt{asydef} environment.
%
% \subsection{Graphics options}
%
% Both the \texttt{asy} environment and the \cmd\asyinclude\ command take
% optional parameters for controlling aspects of the graphics creation. In
% addition to locally setting \texttt{inline} and \texttt{attach}, the
% following options may also be used:
% \begin{description}
% \item[width] Width of the figure
% \item[height] Height of the figure
% \item[keepAspect] Maintain aspect ratio [default true]
% \item[viewportwidth] Viewport width for 3D figures
% \item[viewportheight] Viewport height for 3D figures
% \end{description}
% These may also be set globally using the \cmd\asysetup\ command.
%
% \section{Processing the document}
%
% After running \LaTeX\ on the document, it is necessary to process the
% Asymptote graphics so they can be included in the next compilation. The
% simplest procedure is a recipe such as
% \begin{verbatim}
% pdflatex mydoc
% asy mydoc-*.asy
% pdflatex mydoc
% \end{verbatim}
% This technique will recompile each graphic every time, however. To only
% recompile graphics that have changed, use the \texttt{latexmk}
% tool. Asymptote is distributed with a \texttt{latexmkrc} configuration
% file; place this file in a place where \texttt{latexmk} will find it and
% your document may be compiled, including the \texttt{asy} compilations,
% with \texttt{latexmk mydoc} or \texttt{latexmk --pdf mydoc}.
%
% \section{Implementation}
%
% \iffalse
%<*pkg>
% \fi
%
% \begin{macrocode}
\def\Asymptote{{\tt Asymptote}}
% \end{macrocode}
%
% \begin{macrocode}
\InputIfFileExists{\jobname.pre}{}{\typeout{No file \jobname.pre.}}
% \end{macrocode}
%
% \subsection{Allocations}
%
% \paragraph{Allocations}
%
% \begin{macrocode}
\newbox\ASYbox
\newdimen\ASYdimen
\newcounter{asy}
% \end{macrocode}
%
% \begin{macrocode}
\newwrite\AsyStream
\newwrite\AsyPreStream
% \end{macrocode}
%
% \begin{macrocode}
\newif\ifASYinline
\newif\ifASYattach
\newif\ifASYkeepAspect
\ASYkeepAspecttrue
% \end{macrocode}
%
% \subsection{Packages}
%
% \begin{macrocode}
\RequirePackage{keyval}
\RequirePackage{ifthen}
\RequirePackage{graphicx}
% \end{macrocode}
%
% \paragraph{Emulating packages}
% We cannot assume that Asymptote users have recent
% \TeX\ distributions. (E.g., Fedora until recently still shipped teTeX.)
% So load \textsf{ifpdf} and \textsf{ifxetex} if they exist; otherwise,
% emulate them.
%
% In due course, delete this code and just load the packages.
% \begin{macrocode}
\IfFileExists{ifpdf.sty}{
\RequirePackage{ifpdf}
}{
\expandafter\newif\csname ifpdf\endcsname
\ifx\pdfoutput\@undefined\else
\ifcase\pdfoutput\else
\pdftrue
\fi
\fi
}
% \end{macrocode}
%
% \begin{macrocode}
\IfFileExists{ifxetex.sty}{
\RequirePackage{ifxetex}
}{
\expandafter\newif\csname ifxetex\endcsname
\ifx\XeTeXversion\@undefined\else
\xetextrue
\fi
}
% \end{macrocode}
%
% \begin{macro}{\CatchFileDef}
% Used for \cmd\asyinclude.
% Note that the fallback definition is not as robust as the one provided by catchfile.
% \begin{macrocode}
\IfFileExists{catchfile.sty}{
\RequirePackage{catchfile}
}{
\newcommand\CatchFileDef[3]{%
\begingroup
\everyeof{%
\ENDCATCHFILEMARKER
\noexpand
}%
\long\def\@tempa####1\ENDCATCHFILEMARKER{%
\endgroup
\def##1{####1}%
}%
##3%
\expandafter\@tempa\@@input ##2\relax
}
}
% \end{macrocode}
% \end{macro}
%
% \paragraph{Ensuring attachfile2 is loaded if [attach] is requested}
% \begin{macrocode}
\newif\if@asy@attachfile@loaded
% \end{macrocode}
%
% \begin{macrocode}
\AtBeginDocument{%
\@ifpackageloaded{attachfile2}{\@asy@attachfile@loadedtrue}{}%
\let\asy@check@attachfile\asy@check@attachfile@loaded
}
% \end{macrocode}
%
% \begin{macrocode}
\newcommand\asy@check@attachfile@loaded{%
\if@asy@attachfile@loaded\else
\PackageError{asymptote}{You must load the attachfile2 package}{^^J%
You have requested the [attach] option for some or all of your^^J%
Asymptote graphics, which requires the attachfile2 package.^^J%
Please load it in the document preamble.^^J%
}%
\fi
}
% \end{macrocode}
%
% \begin{macrocode}
\newcommand\asy@check@attachfile{%
\AtBeginDocument{\asy@check@attachfile@loaded}%
\let\asy@check@attachfile\@empty
}
% \end{macrocode}
%
% \paragraph{Macros}
% \begin{macrocode}
\def\csarg#1#2{\expandafter#1\csname#2\endcsname}
% \end{macrocode}
%
% \subsection{Package options}
%
% \begin{macrocode}
\DeclareOption{inline}{%
\ASYinlinetrue
}
\DeclareOption{attach}{%
\asy@check@attachfile
\ASYattachtrue
}
\ProcessOptions*
% \end{macrocode}
%
% \begin{macrocode}
\def\asylatexdir{}
\def\asydir{}
\def\ASYasydir{}
\def\ASYprefix{}
% \end{macrocode}
%
%
% \subsection{Testing for PDF output}
% Note this is not quite the same as \cs{ifpdf}, since we still want PDF
% output when using XeTeX.
% \begin{macrocode}
\newif\ifASYPDF
\ifxetex
\ASYPDFtrue
\else
\ifpdf
\ASYPDFtrue
\fi
\fi
\ifASYPDF
\def\AsyExtension{pdf}
\else
\def\AsyExtension{eps}
\fi
% \end{macrocode}
%
% \subsection{Bug squashing}
%
% \begin{macrocode}
\def\unquoteJobname#1"#2"#3\relax{%
\def\rawJobname{#1}%
\ifx\rawJobname\empty
\def\rawJobname{#2}%
\fi
}
\expandafter\unquoteJobname\jobname""\relax
% \end{macrocode}
% Work around jobname bug in MiKTeX 2.5 and 2.6:
% Turn stars in file names (resulting from spaces, etc.) into minus signs
% \begin{macrocode}
\def\fixstar#1*#2\relax{%
\def\argtwo{#2}%
\ifx\argtwo\empty
\gdef\Jobname{#1}%
\else
\fixstar#1-#2\relax
\fi
}
\expandafter\fixstar\rawJobname*\relax
% \end{macrocode}
%
% Work around bug in dvips.def: allow spaces in file names.
% \begin{macrocode}
\def\Ginclude@eps#1{%
\message{<#1>}%
\bgroup
\def\@tempa{!}%
\dimen@\Gin@req@width
\
[email protected]\relax
\divide\dimen@\dimen@ii
\@tempdima\Gin@req@height
\divide\@tempdima\dimen@ii
\special{PSfile=#1\space
llx=\Gin@llx\space
lly=\Gin@lly\space
urx=\Gin@urx\space
ury=\Gin@ury\space
\ifx\Gin@scalex\@tempa\else rwi=\number\dimen@\space\fi
\ifx\Gin@scaley\@tempa\else rhi=\number\@tempdima\space\fi
\ifGin@clip clip\fi}%
\egroup
}
% \end{macrocode}
%
% \subsection{Input/Output}
%
% \begin{macrocode}
\immediate\openout\AsyPreStream=\jobname.pre\relax
\AtEndDocument{\immediate\closeout\AsyPreStream}
% \end{macrocode}
%
% \begin{macrocode}
\def\WriteAsyLine#1{%
\immediate\write\AsyStream{\detokenize{#1}}%
}
% \end{macrocode}
%
% \begin{macrocode}
\def\globalASYdefs{}
\def\WriteGlobalAsyLine#1{%
\expandafter\g@addto@macro
\expandafter\globalASYdefs
\expandafter{\detokenize{#1^^J}}%
}
% \end{macrocode}
%
% \subsection{Commands for verbatim processing environments}
%
% \begin{macrocode}
\def\ProcessAsymptote#1{%
\begingroup
\def\CurrentAsymptote{#1}%
\let\do\@makeother \dospecials
\@makeother\^^L% and whatever other special cases
\catcode`\ =10
\endlinechar`\^^M \catcode`\^^M=12 \xAsymptote
}
% \end{macrocode}
% Need lots of comment chars here because \meta{line end} is no longer a
% space character.
% \begin{macrocode}
\begingroup
\catcode`\^^M=12 \endlinechar=-1\relax%
\gdef\xAsymptote{%
\expandafter\ProcessAsymptoteLine%
}
\gdef\ProcessAsymptoteLine#1^^M{%
\def\@tempa{#1}%
{%
\escapechar=-1\relax%
\xdef\@tempb{\string\\end\string\{\CurrentAsymptote\string\}}%
}%
\ifx\@tempa\@tempb%
\edef\next{\endgroup\noexpand\end{\CurrentAsymptote}}%
\else%
\ThisAsymptote{#1}%
\let\next\ProcessAsymptoteLine%
\fi%
\next%
}
\endgroup
\def\asy@init{%
\def\ASYlatexdir{}%
\ifx\asylatexdir\empty\else
\def\ASYlatexdir{\asylatexdir/}%
\fi
\ifx\asydir\empty\else
\def\ASYasydir{\asydir/}%
\fi
\def\ASYprefix{\ASYlatexdir\ASYasydir}%
}
% \end{macrocode}
%
% \subsection{User interface}
%
% \begin{macrocode}
\newcommand\asy[1][]{%
\stepcounter{asy}%
\setkeys{ASYkeys}{#1}%
% \end{macrocode}
% Disable the "inline" option if "attach" is enabled:
% \begin{macrocode}
\ifASYattach
\ASYinlinefalse
\fi
% \end{macrocode}
%
% \begin{macrocode}
\asy@init
\immediate\write\AsyPreStream{%
\noexpand\InputIfFileExists{%
\ASYprefix\noexpand\jobname-\the\
[email protected]}{}{}%
}%
\asy@write@graphic@header
\let\ThisAsymptote\WriteAsyLine
\ProcessAsymptote{asy}%
}
% \end{macrocode}
%
% \begin{macrocode}
\def\endasy{%
\asy@finalise@stream
\asy@input@graphic
}
% \end{macrocode}
%
% \begin{macrocode}
\def\asy@write@graphic@header{%
\immediate\openout\AsyStream=\ASYasydir\jobname-\the\
[email protected]\relax
\gdef\AsyFile{\ASYprefix\Jobname-\the\c@asy}%
\immediate\write\AsyStream{%
if(!settings.multipleView) settings.batchView=false;^^J%
\ifxetex
settings.tex="xelatex";^^J%
\else\ifASYPDF
settings.tex="pdflatex";^^J%
\fi\fi
\ifASYinline
settings.inlinetex=true;^^J%
deletepreamble();^^J%
\fi
defaultfilename="\Jobname-\the\c@asy";^^J%
if(settings.render < 0) settings.render=4;^^J%
settings.outformat="";^^J%
\ifASYattach
settings.inlineimage=false;^^J%
settings.embed=false;^^J%
settings.toolbar=true;^^J%
\else
settings.inlineimage=true;^^J%
settings.embed=true;^^J%
settings.toolbar=false;^^J%
viewportmargin=(2,2);^^J%
\fi
\globalASYdefs
}%
}
\def\asy@expand@keepAspect{%
\ifASYkeepAspect keepAspect=true%
\else keepAspect=false%
\fi%
}
% \end{macrocode}
%
% \begin{macrocode}
\def\asy@finalise@stream{%
% \end{macrocode}
% Setting \verb|size()|. Only inserted if one of the dimensions is
% set explicitly (i.e., if both height and width are not empty).
% \begin{macrocode}
\ifx\ASYwidth\@empty
\ifx\ASYheight\@empty
% write nothing!
\else
\immediate\write\AsyStream{size(0,\ASYheight,\asy@expand@keepAspect);}%
\fi
\else
\ifx\ASYheight\@empty
\immediate\write\AsyStream{size(\ASYwidth,0,\asy@expand@keepAspect);}%
\else
\immediate\write\AsyStream{size(\ASYwidth,\ASYheight,\asy@expand@keepAspect);}%
\fi
\fi
% \end{macrocode}
% Setting \verb|viewportsize=()|. Same logic as for \verb|size()|.
% \begin{macrocode}
\ifx\ASYviewportwidth\@empty
\ifx\ASYviewportheight\@empty
% write nothing!
\else
\immediate\write\AsyStream{viewportsize=(0,\ASYviewportheight);}%
\fi
\else
\ifx\ASYviewportheight\@empty
\immediate\write\AsyStream{viewportsize=(\ASYviewportwidth,0);}%
\else
\immediate\write\AsyStream{%
viewportsize=(\ASYviewportwidth,\ASYviewportheight);}%
\fi
\fi
\immediate\closeout\AsyStream
}
% \end{macrocode}
%
% \begin{macrocode}
\def\asy@input@graphic{%
\ifASYinline
\IfFileExists{"\AsyFile.tex"}{%
\catcode`:=12\relax
\@@input"\AsyFile.tex"\relax
}{%
\PackageWarning{asymptote}{file `\AsyFile.tex' not found}%
}%
\else
\IfFileExists{"\AsyFile.\AsyExtension"}{%
\ifASYattach
\ifASYPDF
\IfFileExists{"\AsyFile+0.pdf"}{%
\setbox\ASYbox=\hbox{\includegraphics[hiresbb]{\AsyFile+0.pdf}}%
}{%
\setbox\ASYbox=\hbox{\includegraphics[hiresbb]{\AsyFile.pdf}}%
}%
\else
\setbox\ASYbox=\hbox{\includegraphics[hiresbb]{\AsyFile.eps}}%
\fi
\textattachfile{\AsyFile.\AsyExtension}{\phantom{\copy\ASYbox}}%
\vskip-\ht\ASYbox
\indent
\box\ASYbox
\else
\ifASYPDF
\includegraphics[hiresbb]{\AsyFile.pdf}%
\else
\includegraphics[hiresbb]{\AsyFile.eps}%
\fi
\fi
}{%
% \end{macrocode}
% 3D PRC figures require inline mode.
% \begin{macrocode}
\IfFileExists{"\AsyFile.tex"}{%
\catcode`:=12
\@@input"\AsyFile.tex"\relax
}{%
\PackageWarning{asymptote}{%
file `\AsyFile.\AsyExtension' not found%
}%
}%
}%
\fi
}
% \end{macrocode}
%
% \begin{macrocode}
\def\asydef{%
\let\ThisAsymptote\WriteGlobalAsyLine
\ProcessAsymptote{asydef}%
}
% \end{macrocode}
%
% \begin{macrocode}
\newcommand\asyinclude[2][]{%
\begingroup
\stepcounter{asy}%
\setkeys{ASYkeys}{#1}%
\ifASYattach
\ASYinlinefalse
\fi
\asy@init
\immediate\write\AsyPreStream{%
\noexpand\InputIfFileExists{%
\ASYprefix\noexpand\jobname-\the\
[email protected]}{}{}%
}%
\asy@write@graphic@header
\IfFileExists{#2.asy}{%
\CatchFileDef\@tempa{#2.asy}{%
\let\do\@makeother
\dospecials
\endlinechar=10\relax
}%
}{%
\IfFileExists{#2}{%
\CatchFileDef\@tempa{#2}{%
\let\do\@makeother
\dospecials
\endlinechar=10\relax
}%
}{%
\PackageWarning{asymptote}{file #2 not found}%
\def\@tempa{}%
}%
}%
\immediate\write\AsyStream{\unexpanded\expandafter{\@tempa}}%
\asy@finalise@stream
\asy@input@graphic
\endgroup
}
% \end{macrocode}
%
% \begin{macrocode}
\newcommand{\ASYanimategraphics}[5][]{%
\IfFileExists{_#3.pdf}{%
\animategraphics[{#1}]{#2}{_#3}{#4}{#5}%
}{}%
}
% \end{macrocode}
%
% \subsection{Keys for graphics processing}
%
% \begin{macrocode}
\newcommand\asysetup[1]{\setkeys{ASYkeys}{#1}}
% \end{macrocode}
%
% \begin{macrocode}
\define@key{ASYkeys}{dir}{%
\def\asydir{#1}%
}
\def\ASYwidth{}
\define@key{ASYkeys}{width}{%
\edef\ASYwidth{\the\dimexpr#1\relax}%
}
\def\ASYheight{}
\define@key{ASYkeys}{height}{%
\edef\ASYheight{\the\dimexpr#1\relax}%
}
\define@key{ASYkeys}{keepAspect}[true]{%
\ifthenelse{\equal{#1}{true}}
{\ASYkeepAspecttrue}
{\ASYkeepAspectfalse}%
}
\def\ASYviewportwidth{}
\define@key{ASYkeys}{viewportwidth}{%
\edef\ASYviewportwidth{\the\dimexpr#1\relax}%
}
\def\ASYviewportheight{}
\define@key{ASYkeys}{viewportheight}{%
\edef\ASYviewportheight{\the\dimexpr#1\relax}%
}
% \end{macrocode}
%
% \begin{macrocode}
\define@key{ASYkeys}{inline}[true]{%
\ifthenelse{\equal{#1}{true}}
{\ASYinlinetrue}
{\ASYinlinefalse}%
}
\define@key{ASYkeys}{attach}[true]{%
\ifthenelse{\equal{#1}{true}}
{\ASYattachtrue}
{\ASYattachfalse}%
}
% \end{macrocode}
%
% \iffalse
%</pkg>
% \fi
%
% \Finale
%