% \iffalse meta-comment % \fi % \iffalse %<*driver> \documentclass{ltxdoc} \usepackage{lmodern} \usepackage{\jobname} \usepackage{fancyvrb} \usepackage{scalerel} \usepackage{microtype} \usepackage{amssymb} \usepackage{framed} \usepackage[numbered]{hypdoc} \setlength{\emergencystretch}{0.5\linewidth} \hypersetup{hidelinks} \newcommand{\packagename}[1]{\textsf{#1}} \newcommand{\danger}{\fontencoding{U}\fontfamily{futs}\selectfont\char 49\relax} \newenvironment{warning}% {% \medskip\noindent\hangindent=3em\hangafter=-2% \clubpenalty=10000% \hbox to0pt% {\hskip-\hangindent\smash% {\raisebox{-0.6\baselineskip}{\scaleto{$\danger$}{1.8\baselineskip}}}% \hfill% }\ignorespaces\textbf{\hspace*{-.2em}Warning:} \ignorespaces% }{% \par\medskip% } \EnableCrossrefs \CodelineIndex \begin{document} \DocInput{\jobname.dtx} \end{document} % % \fi % % \GetFileInfo{\jobname.sty} % % \title{^^A % \packagename{asypictureB} --- user-friendly integration % of Asymptote into \LaTeX\thanks{^^A % This document % corresponds to \packagename{asypictureB}~\fileversion, dated~\filedate.^^A % }^^A % } % \author{Charles Staats III\thanks{E-mail: charles dot staats dot iii at gmail.com}} % \date{Released \filedate} % % \maketitle % % \begin{abstract} % The \packagename{asypictureB} package allows users to integrate Asymptote code % for producing pictures into \LaTeX\ source code using the shell-escape % functionality. It is an alternative to the \texttt{asymptote} package % that comes with Asymptote. The most important advantage of the % \packagename{asypictureB} package is that it provides immediate access to % Asymptote errors by repackaging them as \LaTeX\ errors. It also allows % limited use of TeX macros such as |\the\linewidth| inside Asymptote code. % \end{abstract} % % \tableofcontents % % \section{Introduction} % % The \href{http://asymptote.sourceforge.net}% % {Asymptote programming language}\footnote{\url{http://asymptote.sourceforge.net}} % is a powerful tool for the creation of diagrams, both two- and % three-dimensional, that are compatible with % \TeX\ documents. The programming language ships with a \LaTeX\ package % called (appropriately but confusingly) \packagename{asymptote} that makes it % easy to draw pictures by including Asymptote code in the \LaTeX\ source % file. The \packagename{asymptote} package also allows the inclusion of % interactive three-dimensional images in |pdf| files.\footnote{ % The \packagename{asypictureB} package does not % currently support this feature.} % % Unfortunately, the author has encountered the several annoyances % using the \packagename{asymptote} package. % \begin{enumerate} % \item % When my Asymptote code contains errors that prevent it % from compiling, I have found it extremely difficult to track down % the offending line in the \TeX\ source file. This has been the % single biggest annoyance and has led me to compose all but the simplest % Asymptote images as separate |.asy| files, which are then % included into the \TeX\ source once they do what I want. % \item % The \packagename{asymptote} package does not support PNG files, % although the Asymptote language does. % \item % The \packagename{asymptote} package does have a mechanism in place so that % when it is used with |latexmk|, Asymptote images that have not changed are % not recompiled. Unfortunately, the mechanism for recognizing unchanged images % is somewhat fragile: if a single image is inserted or deleted, then all % subsequent images will have to be recompiled. In my experience, this can % make a compilation last several minutes that would otherwise have lasted % several seconds. % \item % The \packagename{asymptote} package can rescale an Asymptote-produced % image to a given width and/or a given height, but it cannot rescale the % image by a given scaling factor. % \end{enumerate} % The most important issue here is the first, which can to some extent be fixed % using editor features; see, for instance, % \href{http://www.artofproblemsolving.com/Wiki/index.php/Asymptote:_Advanced_Configuration\#Showing_Asymptote_error_messages_in_TeXnicCenter}% % {this explanation for TeXnicCenter (Windows only)}\footnote{\raggedright % \url{http://www.artofproblemsolving.com/Wiki/index.php/Asymptote:_Advanced_Configuration\#Showing_Asymptote_error_messages_in_TeXnicCenter} % }. % % The \packagename{asypictureB} package is an alternative to the % \packagename{asymptote} % package that (optionally) % uses |\write18| to call the Asymptote compiler directly from % \LaTeX. The package provides some sort of fix for % all the above issues: % \begin{enumerate} % \item % Asymptote errors are repackaged as \LaTeX\ errors and reported immediately. % At a minimum, users are shown the Asymptote error log and a line number % that will allow them to locate the correct Asymptote picture within the % \TeX\ source file. % % Additionally, \packagename{asypictureB} is usually able to display the % five lines of Asymptote code up to and including the first error. This is % useful to locate the line of code % on which the error occurs, since the line numbers in the Asymptote error log % do not correspond to the line numbers in the \LaTeX\ source file. % % % \item % Any file type that is supported by both the Asymptote language and the % |\includegraphics| command is supported by \packagename{asypictureB}. % Assuming that the document is compiled using \texttt{pdflatex}, this includes % the PNG, PDF, and (more or less) EPS file formats. % \item % Users are permitted and strongly encouraged to specify a distinct name for % each Asymptote image in the file. Distinctly named Asymptote images % are not recompiled if their % code has not changed since the last |latex| run. % \item Any option that works for the |\includegraphics| command can be given % as an option to an |asypicture| environment. % \end{enumerate} % % There is one other feature worth mentioning: \LaTeX\ macros will be expanded % inside Asymptote code if they are prefixed by @ instead of |\|. This % can be used as an incomplete substitute for the |inline| option of the % \packagename{asymptote} package. It also provides a way to use macros % in Asymptote code, which is not a feature that Asymptote supports otherwise. % % Each of these features could stand significant improvements. However, % since implementing them, the author has found himself much more willing % to compose Asymptote code directly in a \TeX\ source file. This indicates % to him that the package might prove useful to others, even in its current % form. His hope is that the best ideas of this package would % be copied and improved in the official \packagename{asymptote} package, % allowing him to deprecate \packagename{asypictureB}. % % \section{Installation and running} % % First of all, the \packagename{asypictureB} package is mostly useless unless you % have Asymptote installed on your system. % \begin{itemize} % \item For a MacOS system, this installation % is automatic with a standard installation % of \href{http://tug.org/mactex/}{MacTeX}. % \item For a Windows system, the % \href{http://asymptote.sourceforge.net/doc/Microsoft-Windows.html}{official % installation instructions} are fairly good. As of this writing, the most % recent version of the |setup.exe| file can be downloaded from % \url{http://sourceforge.net/projects/asymptote/files/2.95/}. % \item % For a Unix-like system, a version of % Asymptote is included in TeX Live, but there may be additional dependencies; % see, for instance, \url{http://tex.stackexchange.com/a/155284/484}. You % should also consult % \href{http://asymptote.sourceforge.net/doc/UNIX-binary-distributions.html}{these} % \href{http://asymptote.sourceforge.net/doc/Compiling-from-UNIX-source.html}{two} % pages from the official documentation. % \end{itemize} % % To use the \texttt{asypictureB} package, % your \texttt{.tex} file should be run with shell-escape % enabled: % \begin{Verbatim}[commandchars=\\\{\},gobble=2] % pdflatex -shell-escape \meta{filename} % \end{Verbatim} % [Note that |latex|, |lualatex|, etc.\ can be substituted for |pdflatex|, although % you should make sure that the engine you use is compatible with whatever % graphics formats your Asymptote pictures are compiled to.] % % \subsection{Running without shell escape} % % If you are unwilling to use shell-escape, \packagename{asypictureB} % creates a script that makes it easy to execute the necessary commands % afterwards. To use it, run the following four commands at the terminal. % (The second command is optional; it allows you to inspect the script % before running it.) % For convenience, it is assumed that the name of the \LaTeX\ source file % is |foo.tex|. % % \bigskip\noindent % \begin{minipage}{0.48\linewidth} % Windows: % \begin{Verbatim}[commandchars=\\\{\},gobble=2] % pdflatex foo % type foo-compile_asy.txt % type foo-compile_asy.txt|cmd % pdflatex foo % \end{Verbatim} % \end{minipage} % \hfill % \begin{minipage}{0.48\linewidth} % MacOS and Unix-like systems: % \begin{Verbatim}[commandchars=\\\{\},gobble=2] % pdflatex foo % cat foo-compile_asy.sh % sh foo-compile_asy.sh % pdflatex foo % \end{Verbatim} % \end{minipage} % % \medskip\noindent % Instead of |pdflatex|, one may use |latex|, |lualatex|, \ldots. Asymptote % errors will be visible as \TeX\ errors on the second run of \LaTeX. % % \begin{warning} % This method is not entirely foolproof. In particular, if |pdflatex| is run % twice in a row without running the \meta{filename}-|compile_asy| % script in between, then % Asymptote pictures which have been compiled at some point in the past, even % if they have since been altered, will % not be recompiled. Should this happen, you can force every |asypicture| % to be recompiled by temporarily adding the |\RequireAsyRecompile| command % before your first |asypicture|. % \end{warning} % % \paragraph{The safer method} % If you want to compile a \TeX\ source file from someone else (e.g., % the internet), you may want neither to enable shell-escape nor to % run a script generated by this file. % A safer way to compile % all Asymptote pictures generated by \packagename{asypictureB} % (and for that matter by the \packagename{asymptote} package) is to run % |asy -noV |\meta{filename}|-*.asy| after compiling \meta{filename}|.tex|. % Once this is done, all the Asymptote files should be compiled, will be % correctly imported upon a second run of |pdflatex| (or |latex|, \ldots). % Re-running |asy| is not necessary until and unless any of the Asymptote % pictures change. This method is ``safe'' in that you have greater % control over which programs are actually being run. % % This method will also work for your own files-in-progress, but is not % recommended for two reasons: % \begin{itemize} % \item Asymptote errors will not be repackaged as \TeX\ errors, negating % one of the main features of the \packagename{asypictureB} package. % \item All Asymptote pictures will be recompiled, even if they have not % changed since the last run. This can add considerably to the compile time. % \end{itemize} % % \subsection{Dependencies} % As currently implemented, the \packagename{asypictureB} package requires % the packages \packagename{fancyvrb} (tested with version 2.8), % \packagename{graphicx} (tested with version 2005/11/14), % \packagename{pgfkeys}, and \packagename{ifplatform} (tested with % version 0.4). In fact, it depends % on undocumented internals of the \packagename{fancyvrb} package, so % later versions of this package could conceivably break it as well as earlier versions. % % If shell-escape is % not enabled, it also requires the \packagename{verbatimcopy} package, % version 0.06 or later. Since \packagename{verbatimcopy} is not backwards % compatible, earlier versions will, in fact, break \packagename{asypictureB}. % % \section{Usage} % % \DescribeEnv{asypicture} Code for Asymptote pictures should be placed % within the |asypicture| environment, which takes one mandatory argument: % a list of comma-separated expressions of the form % \meta{key}\texttt{=}\meta{value}. It is strongly recommended that the % key |name| always be used, since this will prevent the package from % re-compiling pictures whose code has not changed. The time saving can % be substantial if you have a document with a significant number of % Asymptote pictures. % % Keys other than |name| are passed onto an |\includegraphics| % command from the \packagename{graphicx} package. The keys should be given % in the following order: % \begin{enumerate} % \item Keys other than |scale| or |angle|. % \item The |scale| key (if it is used). % \item The |angle| key (if it is used). % \end{enumerate} % The way the package is currently implemented, the |scale| and |angle| keys % will effectively be evaluated last, regardless of the order in which they % are given. However, this behavior is not ideal and may change in future versions % of the package; the goal would be that keys should be evaluated in the order % in which they are given. For the time being, giving keys in the order specified % should ensure compatibility with future versions. % % It is possible to expand macros within an |asypicture| environment by using an % at symbol % \texttt{@} in place of a backslash |\|. For instance, the line % \begin{Verbatim}[gobble=2] % size(@the@linewidth, 0); % \end{Verbatim} % will be translated to something like % \begin{Verbatim}[gobble=2] % size(345.0pt, 0); % \end{Verbatim} % before being compiled by Asymptote. % % \bigskip\noindent % \DescribeEnv{asyheader}Code within an |asyheader| environment is appended to % the ``header,'' which is inserted at the beginning of every \texttt{.asy} file % output by the \packagename{asypictureB} package. Initially, the header % consists of the two lines % \begin{Verbatim}[gobble=2] % defaultpen(fontsize(@getfontsize pt)); % settings.prc = false; % \end{Verbatim} % Again, macros can be expanded inside an |asyheader| environment by prefixing them % by @ rather than |\|. The macros are fully expanded when they are added to the % header, not when they are written to a file. Thus, for instance, in a 10-point % document, the first line of the header will always read % \begin{Verbatim}[gobble=2] % defaultpen(fontsize(10pt)); % \end{Verbatim} % even if the font size is later changed to 12 points. % % Note that any change to the header will require all subsequent |asypicture| % environments to be recompiled. In a document with many Asympotote images, % this could take a while. % % \bigskip\noindent % \DescribeMacro{\getfontsize}The |\getfontsize| macro is an alias for % |\f@size| that does not require |\makeatletter|. It expands to the current % font size (without the suffix |pt|). % % \bigskip\noindent\DescribeMacro{\asylistingfile}The |\asylistingfile| macro % contains the filename of the Asymptote code for the most recent |asypicture|. % It can be used with commands from e.g. \packagename{fancyvrb} or % \packagename{listings} to display the Asymptote code for an image. % % \bigskip\noindent % \DescribeMacro{\RequireAsyRecompile}\DescribeMacro{\AsyCompileIfNecessary} % By default, Asymptote images are compiled only if the Asymptote code has changed. % The command |\RequireAsyRecompile| changes this setting to make all subsequent % images recompile even if the code has not changed. % (This can be useful, for instance, % if you have just updated Asymptote.) The command % |\AsyCompileIfNecessary| restores the default behavior for all subsequent % Asymptote pictures. % % \subsection{Keys for \texttt{asypicture}} % % \DescribeMacro{name} If the key-value combination |name=|\meta{picturename} % appears in the mandatory argument to an |asypicture| environment, then the % contents of that environment will be saved to the file % \begin{Verbatim}[gobble=2,commandchars=\\\{\}] % \meta{filename}-\meta{picturename}.asy % \end{Verbatim} % where \meta{filename} is the name of the current |.tex| file (not including % the |.tex| extension). % The compiled Asymptote picture is saved to an image file such as % \texttt{\meta{filename}-\meta{picturename}.eps}, % \texttt{\meta{filename}-\meta{picturename}.pdf}, or % \texttt{\meta{filename}-\meta{picturename}.png}. % % Alphanumeric characters are allowed in the |name| key, as are the % characters |-| (hyphen) and |_| (underscore). Other characters (including % spaces, asterisks, etc.) should % be avoided. The key may begin with any allowed character; however, names % consisting of a single number with three or fewer digits are discouraged, % since these may conflict with the \packagename{asymptote} package. % % Although the |name| key is technically not required, % it is strongly recommended that distinct names be given % to all the different |asypicture| % environments. This allows the \packagename{asypictureB} package to avoid % recompiling pictures whose code has not changed---even if the pictures are % reordered. % % If the name \meta{picturename} has been used before, % a suffix will be appended to it: |__1| for the first repeat, |__2| for % the second repeat, etc. Thus, if the same name (say |foo|) % is used for several |asypicture|s, % then deleting the first of these will force all the others to recompile; % but changing a picture of a different name will not affect any of the % pictures named |foo|. % % If no |name| key is given, the key-value combination |name=noname| is % assumed. This default can be changed using the |\asyset| command: after % the line % \begin{Verbatim}[gobble=2] % \asyset{name = foo} % \end{Verbatim} % nameless pictures will be called |foo| rather than |noname|. % % \begin{warning} % If \packagename{asypictureB} determines that the contents of an |asypicture| % environment named \meta{picturename} % have changed since the last run, it will delete % all of the following files that exist: % \begin{Verbatim}[gobble=2,commandchars=\\\{\}] % \texttt{\meta{filename}-\meta{picturename}.eps} % \texttt{\meta{filename}-\meta{picturename}.pdf} % \texttt{\meta{filename}-\meta{picturename}.png} % \end{Verbatim} % \end{warning} % % \subsection{Styles} % \DescribeMacro{\asyset} % Since \packagename{asypictureB} uses \packagename{pgfkeys} for keys, % it is possible to create new keys, called ``styles,'' that set % several other keys at once. For instance, the following line % \begin{Verbatim}[gobble=2] % \asyset{mysize/.style = {width=6cm, height=4cm}} % \end{Verbatim} % creates a new key called |mysize|. Any time in the document after this % line, the command % \begin{Verbatim}[gobble=2] % \begin{asypicture}{name=picturename, mysize} % \end{Verbatim} % is exactly equivalent to the line % \begin{Verbatim}[gobble=2] % \begin{asypicture}{name=picturename, width=6cm, height=4cm} % \end{Verbatim} % This is precisely the same style mechanism that is used in TikZ; in % fact, |\asyset|\marg{keys} is equivalent to |\pgfkeys{/asy/.cd,|\meta{keys}|}|, % much as |\tikzset|\marg{keys} is equivalent to |\pgfkeys{/tikz/.cd,|\meta{keys}|}|. % % The |\asyset| command may be used in the preamble or anywhere in the body of % the document where macros are processed normally. It may not be used in the % body of an |asypicture| or any other verbatim-like environment. % % \section{Examples} % % Here is a simple example: % % \noindent\def\asywidth{2.5cm} % \begin{minipage}[t]{\asywidth} % \vspace*{0pt} % \begin{asypicture}[gobble=2]{name = sphere_image, width=\asywidth} % settings.outformat = "png"; % settings.render = 16; % size(@asywidth,0); % import three; % draw(unitsphere, white); % \end{asypicture} % \end{minipage} % \hfill % \begin{minipage}[t]{\dimexpr\linewidth-\asywidth-10pt\relax} % \vspace*{0pt} % \begin{Verbatim}[gobble=2,codes={\catcode`@=0},frame=single] % \begin{asypicture}{name=sphere_image} % settings.outformat = "png"; % settings.render = 16; % size(@asywidth,0); % import three; % draw(unitsphere, white); % \end{asypicture} % \end{Verbatim} % \end{minipage} % % \medskip\noindent % Here is an example that uses the user-defined macro |\asywidth| % inside the Asymptote code to avoid duplicate code. % % \begin{Verbatim}[gobble=2,tabsize=4,frame=single] % \noindent\def\asywidth{4cm} % \begin{asypicture}{name=triangle,width=\asywidth} % settings.outformat="pdf"; % size(@asywidth,0); % draw((0,0) -- (1,0) -- (1,1) -- cycle); % dot((1,0), L=Label( % "\textbf{Bold} \textsc{Smallcaps}", % align=NE)); % \end{asypicture} % \hfill % \begin{minipage}{\dimexpr\linewidth-\asywidth-15pt\relax} % \VerbatimInput[frame=leftline]{\asylistingfile} % \end{minipage} % \end{Verbatim} % The result: % % \noindent\def\asywidth{4cm} % \begin{asypicture}[gobble=2]{name=triangle,width=\asywidth} % settings.outformat="pdf"; % size(@asywidth,0); % draw((0,0) -- (1,0) -- (1,1) -- cycle); % dot((1,0), L=Label( % "\textbf{Bold} \textsc{Smallcaps}", % align=NE)); % \end{asypicture} % \hfill % \begin{minipage}{\dimexpr\linewidth-\asywidth-15pt\relax} % \VerbatimInput[frame=leftline]{\asylistingfile} % \end{minipage} % % \bigskip % The |\VerbatimInput| command is from the \packagename{fancyvrb} package. % The first two lines of the Asymptote code listing come from the default % |asyheader|. These, along with some extra whitespace, % can be eliminated by playing with the \packagename{fancyvrb} options. % More importantly for our purposes, changing the single line % \begin{Verbatim}[gobble=2] % \noindent\def\asywidth{4cm} % \end{Verbatim} % to % \begin{Verbatim}[gobble=2] % \noindent\def\asywidth{4.5cm} % \end{Verbatim} % will automatically affect both the width of the |asypicture| and the % width of the |minipage|: % % \begin{Verbatim}[gobble=2,tabsize=4,frame=single] % \noindent\def\asywidth{4.5cm} % \begin{asypicture}{name=triangle2,width=\asywidth} % settings.outformat="pdf"; % size(@asywidth,0); % draw((0,0) -- (1,0) -- (1,1) -- cycle); % dot((1,0), L=Label( % "\textbf{Bold} \textsc{Smallcaps}", % align=NE)); % \end{asypicture} % \hfill % \begin{minipage}{\dimexpr\linewidth-\asywidth-15pt\relax} % \VerbatimInput[frame=leftline,gobble=4,firstline=5] % {\asylistingfile} % \end{minipage} % \end{Verbatim} % produces % % \noindent\def\asywidth{4.5cm} % \begin{asypicture}[gobble=2]{name=triangle2,width=\asywidth} % settings.outformat="pdf"; % size(@asywidth,0); % draw((0,0) -- (1,0) -- (1,1) -- cycle); % dot((1,0), L=Label( % "\textbf{Bold} \textsc{Smallcaps}", % align=NE)); % \end{asypicture} % \hfill % \begin{minipage}{\dimexpr\linewidth-\asywidth-15pt\relax} % \VerbatimInput[frame=leftline,gobble=4,firstline=5] % {\asylistingfile} % \end{minipage} % % \section{Error handling} % % It has been stated several places in this document that % \packagename{asypictureB} repackages Asymptote errors as % \TeX\ errors (and at least once that this feature, among others, % could stand significant improvements). In this section is described % exactly how these errors are repackaged, at least as of the current % implementation. None of this is guaranteed to remain the same in % future versions. % % When \packagename{asypictureB} tells Asymptote to compile the file % \begin{quote} % \texttt{\meta{filename}-\meta{picturename}.asy}, % \end{quote} % it reroutes all % warning and error messages to the file % \begin{quote} % \texttt{\meta{filename}-\meta{picturename}\_errors.txt}. % \end{quote} % Once the Asymptote run is complete, it checks whether the error file % has any lines of the form % \begin{quote} % \texttt{\meta{filename}-\meta{picturename}.asy:\meta{number}.\meta{stuff}} % \end{quote} % If so, it throws a \LaTeX\ package error and displays % the contents of the error file, which include all the errors and % warnings issued by Asymptote. Note that if some kind of asy error occurs % that does not match this output form, \packagename{asypictureB} will not % notice the error. % % The \LaTeX\ error message will give the line number of the % |\end{asypicture}| command for the |asypicture| that caused the error, which % is of limited use in isolating the error. % More precise line numbers are given by the Asymptote error log; % however, these line numbers are % for the |asy| file rather than the |tex| file, and consequently not % terribly helpful. % % To allow the user to locate the line on which the actual error occurred, % the \packagename{asypictureB} package attempts to parse the Asymptote % error log and print out the five lines leading up to the error. More precisely, % it does the following: % \begin{enumerate} % \item From the first line of the form % \begin{quote} % \texttt{\meta{filename}-\meta{picturename}.asy:\meta{number}.\meta{stuff}} % \end{quote} % the \meta{number} is extracted. Note that if no successful extraction occurs, % there will be no \LaTeX\ error. % \item Assuming \meta{number} was extracted successfully, the lines % of the |asy| file from % the inclusive range $\meta{number}-5$ to \meta{number} are displayed % as part of the \LaTeX\ error message. These lines are usually identical % and almost always similar to the lines in the actual |tex| file % leading up to the error. In the author's experience, this is usually enough % information to locate without difficulty the line on which the error % occurred.\footnote{I.e., the line that caused Asymptote to choke. % The usual rules of debugging apply: the line on which the compiler identified % an error might have been correct if not for an earlier mistake that % was syntactically correct.} % \end{enumerate} % % \noindent Here's an example: Consider \LaTeX\ file % \begin{Verbatim}[gobble=2,numbers=left,tabsize=4] % \documentclass{article} % \usepackage{asypictureB} % \begin{document} % \def\asywidth{5cm} % \begin{asypicture}{name=error_example} % // A comment % size(@asywidth, 0); % path l1 = (0,0) -- (1,1); % // Another comment % draw(box((0,0),(1,1))) % draw(l1, dotted); % draw(l2, dashed); % \end{asypicture} % \end{document} % \end{Verbatim} % If this file is saved as \texttt{asyerrorexample.tex} and then % compiled with the shell-escape option, the following error results: % \begin{Verbatim}[gobble=2] % ! Package asypictureB Error: % draw(l1, dotted); % ^ % asyerrorexample-error_example.asy: 10.5: syntax error % error: could not load module 'asyerrorexample-error_example.asy' % % 6 size(5cm, 0); % 7 path l1 = (0,0) -- (1,1); % 8 // Another comment % 9 draw(box((0,0),(1,1))) % 10 draw(l1, dotted); % . % % See the asypictureB package documentation for explanation. % Type H for immediate help. % ... % % l.13 \end{asypicture} % \end{Verbatim} % The \LaTeX\ error message first repeats the Asymptote error log, % which explains that there was a syntax error. Next, the five lines % leading up to the error are displayed. % Looking at these five lines, % one can determine that the difficulty was a comma omitted % on line 9 of the Asympote file. (It is diagnosed on line 10 because % of how the compiler works.) Looking at the context, this corresponds % to line 10 of the \LaTeX\ file. % % Note that the macro |@asywidth| in the |asypicture| code % has been expanded to \texttt{5cm} in the error message. % % \section{Macros in \texttt{asypicture}s} % % When the author first conceived of allowing macros in an % |asypicture| environment, the goal was to allow expressions like % |size(@asywidth,0);| where |\asywidth| was a user-defined macro % also used in the \LaTeX\ code to avoid hard-coding numbers. % However, it was almost immediately apparent that this feature % has more sophistocated uses, such as allowing user-defined % syntax or even creating something similar to templates\footnote{If you % actually want to use templates in Asymptote code, the experimental % \emph{templated imports} feature of the language is probably a % better choice than the macro techniques described in this section}. % % \subsection{Limitations} % % Before discussing the nifty features, let's discuss the fairly % severe limitations they will have to work around. % % \begin{description} % \item[No grouping symbols.] If a macro takes a mandatory argument % inside braces |{}|, then that macro cannot be used inside an % |asypicture|. % \item[Purely expandable macros only.] Macros will be expanded, but not % executed. In particular, macros that allow optional arguments will usually % go horribly wrong. % \item[One line only.] As we will discuss, it is % possible to use ``unconventionally delimited'' arguments. However, even % in this case, a macro and all its arguments must fit on a single line. % \end{description} % % Since the first two points all but forbid the use of macros with % conventional arguments, it might % be wondered whether macros in Asymptote code can be used for anything % more interesting than storing user-defined lengths. They can. % % \subsection{Single-token arguments} % % [This is really more a fix than an example, but this seems as good a % place as any to discuss it.] % % Some macros, such as |\the|, % take arguments that consist only of a single character or % control sequence. For instance, |\the\textwidth| expands to something like % \texttt{345.0pt}, whereas |\textwidth| by itself expands only to % |\textwidth|. This can be significant if you want to produce an % Asymptote picture that takes up a specified fraction of the text width. % % \subsection{Unconventionally delimited arguments} % % The \TeX\ primitive |\def| can be used to produce macros that are % quite flexible about how they are delimited. For instance, the \TeX\ code % \begin{Verbatim}[gobble=2] % \def\draw#1;{draw(#1);} % \end{Verbatim} % will take as its argument everything between the |\draw| command and the % first subsequent semicolon. If this line showed up in \TeX\ code % (preferably in the preamble), then subsequent |\asypicture| environments % could include a line such as % \begin{Verbatim}[gobble=2] % @draw box((0,0), (1,1)); % \end{Verbatim} % as an arguably more aesthetic alternative to the translation % \begin{Verbatim}[gobble=2] % draw( box((0,0), (1,1))); % \end{Verbatim} % % A more advanced example is essentially a template for a sorting % function\footnote{The algorithm here is a somewhat inefficient % mergesort.}. % Include the following code in the \TeX\ preamble: % \begin{Verbatim}[gobble=2] % \def\definesortfunction #1;{% % #1[] sort(#1[] a) { % if (a.length <= 1) return a; % static #1[] merge(#1[] b, #1[] c) { % #1[] toreturn; % int i = 0, j = 0; % while (i < b.length && j < c.length) { % if (!(c[j] < b[i])) { toreturn.push(b[i]); ++i; } % else { toreturn.push(c[j]); ++j; } % } % while (i < b.length) { % toreturn.push(b[i]); % ++i; % } % while (j < c.length) { % toreturn.push(c[j]); % ++j; % } % return toreturn; % } % int halfway = floor(a.length / 2); % #1[] b = sort(a[0:halfway]); % #1[] c = sort(a[halfway:a.length]); % % % return merge(b, c); % }} % \end{Verbatim} % Then within any |asypicture| environment, the line |@definesortfunction T;| % can be used to define a function |T[] sort(T[])| that returns a sorted % version of its argument, for any type |T| for which the less than operator % |<| is defined. For instance, within an |asypicture|, the code % \begin{Verbatim}[gobble=2] % bool operator <(pair a, pair b) { % return (a.x < b.x || (a.x == b.x && a.y < b.y)); % } % % @definesortfunction pair; % \end{Verbatim} % makes available a lexicographic sorting routine for ordered pairs of real % numbers. % % Unfortunately, while this compiles correctly, the resulting Asymptote % file has no line breaks in the entire definition of the sort function. % If you want the Asymptote code (as opposed to just the |asypicture| code) % to be readable, the following setup, proposed by Enrico Gregorio\footnote{ % \url{http://tex.stackexchange.com/a/160740/484}}, does the job: % % \begin{Verbatim}[gobble=2] % \begingroup % \endlinechar=`^^J \obeyspaces% end of lines are newlines % \gdef\definesortfunction #1;{% eat up the space following the macro % #1[] sort(#1[] a) { % if (a.length <= 1) return a; % static #1[] merge(#1[] b, #1[] c) { % #1[] toreturn; % int i = 0, j = 0; % while (i < b.length && j < c.length) { % if (!(c[j] < b[i])) { toreturn.push(b[i]); ++i; } % else { toreturn.push(c[j]); ++j; } % } % while (i < b.length) { % toreturn.push(b[i]); % ++i; % } % while (j < c.length) { % toreturn.push(c[j]); % ++j; % } % return toreturn; % } % int halfway = floor(a.length / 2); % #1[] b = sort(a[0:halfway]); % #1[] c = sort(a[halfway:a.length]); % % % return merge(b, c); % }% this % is necessary % }% this % is necessary % \endgroup% this % is necessary % \end{Verbatim} % % \begin{warning} % If two commands use the same unconventional delimiter, then they cannot % be nested. In particular, a command cannot appear inside its own argument. % This is one of the reasons people usually delimit with grouping % symbols, which is not an option here, short of using |@bgroup| and % |@egroup| with copious occurrences of |@expandafter|. % \end{warning} % \begin{warning} % The |\def| command is not expandable. Thus, the code defining the % macros must be given \emph{outside} |asypicture| environments, % even when the macros are intended for use exclusively inside |asypicture|s. % \end{warning} % % % \section{Missing features} % % The introduction of this documentation touted ways in which % \packagename{asypictureB} improves on the behavior of the \packagename{asymptote} % package. In this section, I clarify ways in which it falls short and % describe how to compensate where possible. My hope % is that these differences would narrow in both directions until only % one package is necessary---preferably the official \packagename{asymptote} % package. % % Note that some of these ``missing features'' cannot be fixed without % breaking backwards compatibility. This is largely why the package is % named \packagename{asypictureB}, allowing room for a future, more % powerful version named \packagename{asypicture}, in case the % \packagename{asymptote} package does not step into the gap. % % \begin{framed} % \noindent\textbf{Tip:} To retrieve the documentation for the % \packagename{asymptote} \LaTeX\ package, % type \texttt{texdoc asy-latex} at the command line. To retrieve the % documentation for the Asymptote programming language, type % \texttt{texdoc asymptote}. To retrieve the documentation for % \packagename{asypictureB}, type \texttt{texdoc asypictureB}. % \end{framed} % % \paragraph{No 3d interaction} % One of the most spectacular features of the \packagename{asymptote} package is % the embedding of interactive three-dimensional images in PDF files. % (Note that this requires the |inline| option when loading the package.) % The \packagename{asypictureB} package currently has no such feature. % In fact, the default header includes % the line \texttt{settings.prc = false;} to prevent Asymptote from trying % to produce an interactive (|prc|) image, since this might break things. % % \paragraph{No \texttt{inline} option} % A second feature that is important, but less spectacular, is the |inline| % option itself, which causes the Asymptote labels to be compiled (in \LaTeX) % with all the % same packages loaded and macros defined as in the original document. % For instance, font consistency between the Asymptote images and the % larger document is ensured by this option. % It comes with an important limitation---Asymptote cannot use size information % about the labels when this option is in use. % % The closest % equivalent in the \packagename{asypictureB} package is the immediate % expansion of macros introduced by the @ symbol. This does not have the % drawback of the |inline| option, and has many additional uses. However, % it is less flexible inside labels (since, e.g., macros with arguments % cannot be used this way), and does not ensure font consistency. % % To compensate for this when using \packagename{asypictureB}, important % packages and macro definitions should be echoed in the Asymptote header. % Here is an example of code that could be placed in the preamble of a document % to make the macro |\RR| (for $\mathbb R$) available in both the document % text and the labels of its Asymptote pictures: % \begin{Verbatim}[gobble=2] % \usepackage{amssymb} % \newcommand{\RR}{\mathbb{R}} % \begin{asyheader} % usepackage("amssymb"); % texpreamble("\newcommand{\RR}{\mathbb{R}}"); % \end{asyheader} % \end{Verbatim} % % \paragraph{The output format is not automatically set.} % When using \packagename{asymptote}, the output format is automatically % set to either |eps| or |pdf| depending on what \TeX\ engine is being run % (and which kind of graphics file it prefers). When using \packagename{asypictureB}, % no such provision is made; if any format other than |eps| is desired, % it must be selected by including the Asymptote code % \texttt{settings.outformat="pdf";} (or |"png"|). This is by design, to allow % the use of |png| files; but it can be a bit annoying at times. To set all % Asymptote files to have |pdf| format, include the code % \begin{Verbatim}[gobble=2] % \begin{asyheader} % settings.outformat="pdf"; % \end{asyheader} % \end{Verbatim} % in the preamble (or anywhere prior to the first |asypicture| environment). % % \paragraph{Keys to \texttt{asypicture} are not conveyed to Asymptote} % In the \packagename{asymptote} package, keys like |width| and % |height| are conveyed both to the implicit |\includegraphics| command % and to Asymptote. In \packagename{asypictureB}, they are conveyed only % to the |\includegraphics| command; font size and even resolution (for % rasterized images) will be % changed in the process of scaling the picture. % Thus, the preferred method is to set the width, height, etc.\ % through Asymptote's |size| command. % % \strut % % \noindent % \begin{minipage}{\textwidth} % \gdef\asywidth{3.5cm} % Bad (font size distorted): % % \medskip % \begin{minipage}{\asywidth} % \begin{asypicture}[gobble=2]{name=bad_width, % width=\asywidth} % settings.outformat="pdf"; % draw(unitcircle); % label("a label", position=(0,0), align=NE); % \end{asypicture} % \end{minipage} % \hfill % \begin{minipage}{\dimexpr\linewidth-\asywidth-10pt\relax} % \begin{Verbatim}[gobble=2,codes={\catcode`@=0}] % \begin{asypicture}{name=bad_width, % width=@asywidth} % settings.outformat="pdf"; % draw(unitcircle); % label("a label", position=(0,0), align=NE); % \end{asypicture} % \end{Verbatim} % \end{minipage} % \end{minipage} % % \bigskip % \noindent % \begin{minipage}{\textwidth} % Good: % % \medskip % \begin{minipage}{\asywidth} % \begin{asypicture}[gobble=2]{name=good_width, width=\asywidth} % size(@asywidth,0); % settings.outformat="pdf"; % draw(unitcircle); % label("a label", position=(0,0), align=NE); % \end{asypicture} % \end{minipage} % \hfill % \begin{minipage}{\dimexpr\linewidth-\asywidth-10pt\relax} % \begin{Verbatim}[gobble=2,codes={\catcode`@=0}] % \begin{asypicture}{name=good_width, width=@asywidth} % size(@asywidth,0); % settings.outformat="pdf"; % draw(unitcircle); % label("a label", position=(0,0), align=NE); % \end{asypicture} % \end{Verbatim} % \end{minipage} % \end{minipage} % % \bigskip\noindent % Note that in the ``good'' example, the key |width=3.5cm| is necessary % only if you want to make sure the included image has \emph{precisely} % the specified % width, and probably not even then. % % \paragraph{No spaces in file names} The \packagename{asymptote} package % takes measures to accomodate peculiar file names---in particular, file % names that include spaces. The \packagename{asypictureB} package does not. % % \paragraph{No directory specification} The \packagename{asymptote} package % allows the user to specify a directory in which to store the Asymptote % code and images. The \packagename{asypictureB} package does not currently % have this feature, although there is a patch by user202729 that will hopefully % be included in the next version. Note that neither package respects the % |-output-directory| commandline option. % % \paragraph{Suboptimal interaction with \texttt{latexmk}} By design, the % \packagename{asypictureB} package allows the image format to be specified by % the Asymptote code; it does not care whether a |png| or |pdf| file is produced. % Unfortunately, |latexmk| relies on being able to identify the generated image file % from the \TeX\ log file. Thus, if you use \packagename{asypictureB} with |latexmk|, % it will rerun Asymptote every time for |asypicture|s that produce a file format other % than the one expected by |latexmk|. Since \packagename{asypictureB} and |latexmk| % are two different solutions to the same problem, I expect most users will choose % one or the other. But for those who want to use them together, hopefully there will % be a better solution in the future. % % \section{Acknowledgements} % % The current \packagename{asypictureB} package incorporates bug fixes and improvements % by \href{https://github.com/user202729}{user202729} % (\url{https://tex.stackexchange.com/users/250119}) % and \href{https://github.com/cfr42}{cfr} % (\url{https://tex.stackexchange.com/users/39222}). For more details, % see the \href{https://github.com/charlesstaats/asypictureB/commits/main/}{commit history on github}. % % \StopEventually{^^A % \PrintChanges % \PrintIndex % } % % \section{Implementation} %\iffalse %<*package> %\fi % \begin{macrocode} \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{asypictureB} [2025/01/26 v0.4 user-friendly integration of Asymptote into LaTeX] \RequirePackage{fancyvrb} \RequirePackage{graphicx} \RequirePackage{pgfkeys} \makeatletter \def\asy@OutFile{\FV@OutFile} \RequirePackage{ifplatform} % \end{macrocode} % Define the |\shell@execute| command. If shell escape is enabled, the % command executes its contents in the shell. Otherwise, the command % is written to a script for the user to execute. % \begin{macrocode} \ifshellescape \def\ASYPIC@shell{18} \newcommand{\shell@execute}{\immediate\write\ASYPIC@shell} \else \newwrite\ASYPIC@shell \ifwindows \openout\ASYPIC@shell=\jobname-compile_asy.txt\relax \else \openout\ASYPIC@shell=\jobname-compile_asy.sh\relax \fi \newcommand{\shell@execute}[1]{{% \edef\temp{#1}% \write\expandafter\ASYPIC@shell\expandafter{\temp}% }} \fi % \end{macrocode} % Define the |\copyfile| command, which should work regardless of whether % shell escape is enabled. (If shell escape is enabled, it is more efficient.) % \begin{macrocode} \ifshellescape \newcommand{\copyfile}[2]{% \ifwindows% \immediate\write18{copy #1 #2 /y}% \else% \immediate\write18{cp #1 #2}% \fi% } \else \RequirePackage{verbatimcopy} \newcommand{\copyfile}[2]{% \OldVerbatimCopy{#1}{#2}% } \fi % \end{macrocode} % Define the |\deletefile| command. Unlike |\copyfile|, this command will % have no immediate effect if shell escape is not enabled, instead writing % a line to the script. (If shell escape \emph{is} enabled, of course the % command will immediately delete the file.) % \begin{macrocode} \newcommand{\deletefile}[1]{% \ifwindows% \shell@execute{del #1}% \else% \shell@execute{rm #1}% \fi% } % \end{macrocode} % % Set up the key-value system for \packagename{asypictureB} using \packagename{pgfkeys}. % \begin{macrocode} \newcommand{\asyset}[1]{\pgfqkeys{/asy}{#1}} \newcommand{\@asyerrorfilename}{\@asypicturename_errors.txt} \newcounter{@asy@linenumber} \asyset{name/.initial=noname, name/.value required}% \asyset{graphic options/.code={}} \asyset{set graphic option/.style={graphic options/.append code=#1}} % \end{macrocode} % Unrecognized keys should be passed to the |\includegraphics| command % using |\setkeys|. % \begin{macrocode} \asyset{.unknown/.code = % {% \edef\unknownkey{\pgfkeyscurrentname}% \asyset{set graphic option/.expand once = {% \expandafter\setkeys\expandafter{% \expandafter G\expandafter i\expandafter n\expandafter% }\expandafter{\unknownkey=#1}% }}% }% } % \end{macrocode} % However, scale and angle must be dealt with separately. % % Important note: using this implementation, scale and angle will always be the next-to-last, respectively % the last, keys executed, no matter in what order the keys are given. Thus, it is impossible to rotate an % asypicture and then set the width or height using these keys. However, this functionality can be provided % within the Asymptote code. % \begin{macrocode} \def\asy@scale{1} \asyset{scale/.style={set graphic option = {\def\asy@scale{#1}}}, scale/.value required} \newcommand{\asy@angle}{0} \asyset{angle/.style = {set graphic option = {\def\asy@angle{#1}}}, angle/.value required} \newcommand{\getfontsize}{\f@size} \newif\ifasyfilechanged \newif\ifASYPIC@flush \newif\if@asyrepeat \newread\@asyreadold \newread\@asyreadnew \edef\@tempasyfile{\jobname-temp} \newcommand{\RequireAsyRecompile}{\ASYPIC@flushtrue} \newcommand{\AsyCompileIfNecessary}{\ASYPIC@flushfalse} \AsyCompileIfNecessary \newcommand\clearasyheader{\def\ASYPIC@header{}} \def\ASYPIC@header{} \def\asyheader{\FV@Environment{}{asyheader}} \def\FVB@asyheader{% \@bsphack \begingroup \FV@UseKeyValues \FV@DefineWhiteSpace \def\FV@Space{\space}% \FV@DefineTabOut \def\FV@ProcessLine##1{\g@addto@macro\ASYPIC@header{##1^^J}}% \let\FV@FontScanPrep\relax %% DG/SR modification begin - May. 18, 1998 %% (to avoid problems with ligatures) \let\@noligs\relax %% DG/SR modification end \FV@Scan}% \def\FVE@asyheader{\endgroup\@esphack} \DefineVerbatimEnvironment{asyheader}{asyheader}% {codes={\catcode`@=0},tabsize=4} % \end{macrocode} % Set up the default |asyheader|: % \begin{macrocode} \begin{asyheader} defaultpen(fontsize(@getfontsize pt)); settings.prc = false; \end{asyheader} % \end{macrocode} % Now, define the |asypicture| environment using % \packagename{fancyvrb} internals: % \begin{macrocode} \def\asypicture{\FV@Environment{}{asypicture}} % \end{macrocode} % % Define the |\ASYPIC%recordname| command. As an example, |\ASYPIC@recordname@foo| % in the file |bar.tex| would set |\asylistingfile| to |bar-foo.asy| the first % time it is called. A second call to |\ASYPIC@recordname{foo}| would set % |\asylistingfile| to |bar-foo__1.asy|, a third to |bar-foo__2.asy|, and so on. % The next number to use is stored in the macro |\ASYPIC@name@foo|. (Note that this % is a macro, not a counter.) % \begin{macrocode} \newcommand{\ASYPIC@recordname}[1]{% \edef\tempmacroname{ASYPIC@name@#1}% \ifcsname\tempmacroname\endcsname%% if \ASYPIC@name@... is defined \edef\oldnum{\csname\tempmacroname\endcsname}% \edef\@asypicturename% {\jobname-#1__\oldnum}% \expandafter\xdef\csname\tempmacroname\endcsname% {\the\numexpr\oldnum+1\relax}% \edef\ASYPIC@current@num{\csname\tempmacroname\endcsname}% \else%% This is the first time this name is being used. \edef\@asypicturename% {\jobname-#1}% \expandafter\gdef\csname\tempmacroname\endcsname{1}% \fi% \xdef\asylistingfile{\@asypicturename.asy} } % \end{macrocode} % Most of % the following definition is copied verbatim from the % definition of the |VerbatimOut| environment in % |fancyvrb.dtx|. I don't actually understand what a lot of % it does. % \begin{macrocode} \def\FVB@asypicture#1{% \@bsphack \asyset{graphic options/.code={}}% \asyset{#1, name/.get = \currentname}% \ASYPIC@recordname{\currentname}% \begingroup \FV@UseKeyValues \FV@DefineWhiteSpace \def\FV@Space{\space}% \FV@DefineTabOut \def\FV@ProcessLine{\immediate\write\asy@OutFile}% \immediate\openout\asy@OutFile\@tempasyfile.asy\relax \immediate\write\asy@OutFile{\ASYPIC@header^^J} \let\FV@FontScanPrep\relax %% DG/SR modification begin - May. 18, 1998 %% (to avoid problems with ligatures) \let\@noligs\relax %% DG/SR modification end \FV@Scan} \newcommand{\ASYPICcomparefiles}[2]{ \IfFileExists{\@asypicturename.asy}% {\openin\@asyreadold=#1.asy\relax% \openin\@asyreadnew=#2.asy\relax% \asyfilechangedfalse% \@asyrepeattrue% \loop% \ifeof\@asyreadold% \@asyrepeatfalse% \ifeof\@asyreadnew% \else% \asyfilechangedtrue% \fi% \else% \ifeof\@asyreadnew% \@asyrepeatfalse% \asyfilechangedtrue% \else% Not at the end of either file in this case \readline\@asyreadold to \oldfileline% \readline\@asyreadnew to \newfileline% \ifx\oldfileline\newfileline% \@asyrepeattrue% \else \asyfilechangedtrue% \@asyrepeatfalse% \fi% \fi% \fi% \if@asyrepeat \repeat% \closein\@asyreadold% \closein\@asyreadnew% }% {\asyfilechangedtrue}% \IfFileExists{#1.pdf}{}{% \IfFileExists{#1.png}{}{% \IfFileExists{#1.eps}{}{% \asyfilechangedtrue% }% }% }% } \def\ASYPIC@runasy{% \message{Attempting to run asy on \@asypicturename.asy^^J}% \shell@execute{asy -noV \@asypicturename.asy 2> \@asyerrorfilename}% \openin\@asyreadold=\@asyerrorfilename\relax% \ifeof\@asyreadold% \closein\@asyreadold% Error log does not exist. \else% \def\@asyerrormessage{^^J}% %Create command to process line of log file to figure %out the Asymptote file line number: \edef\@asy@temp{% \def\noexpand\@asy@processerrorline####1\detokenize\expandafter{% \@asypicturename.asy:% }% }% \@asy@temp##2.##3:\relax{% \xdef\@asy@errorlinenumber{\numexpr##2\relax}}% % \gdef\@asy@errorlinenumber{-5}% {% \endlinechar=-1% \loop\unless\ifeof\@asyreadold% \readline\@asyreadold to \@asyerrorcurrentline% \ifnum\@asy@errorlinenumber=-5% {\expandafter\expandafter\expandafter% \@asy@processerrorline\expandafter% % Suffix provides default of -5: \@asyerrorcurrentline\detokenize\expandafter% {\@asypicturename.asy:} -5.1:\relax% }% \fi% \expandafter\g@addto@macro\expandafter\@asyerrormessage% \expandafter{\@asyerrorcurrentline^^J}% \repeat% }% \closein\@asyreadold% \ifnum\@asy@errorlinenumber=-5% No error \else% \openin\@asyreadold\@asypicturename.asy\relax% \edef\numlinesout{5} \setcounter{@asy@linenumber}{\numlinesout} \loop\ifnum\value{@asy@linenumber}<\@asy@errorlinenumber% \readline\@asyreadold to \temp% \stepcounter{@asy@linenumber}% \repeat% % \addtocounter{@asy@linenumber}{-\numlinesout}% % {% \endlinechar=`^^J% \loop\ifnum\value{@asy@linenumber}<\@asy@errorlinenumber% \stepcounter{@asy@linenumber}% \edef\temp/{\arabic{@asy@linenumber}}% \expandafter\g@addto@macro\expandafter% \@asyerrormessage\expandafter{\temp/ }% \readline\@asyreadold to \@asytempmessage% \expandafter\g@addto@macro\expandafter% \@asyerrormessage\expandafter{\@asytempmessage}% \repeat% }% \closein\@asyreadold% \PackageError{asypictureB}{\@asyerrormessage}{% The Asymptote run described above gave a non-empty error log. I have^^J% reproduced the error log and attempted to print the five lines leading^^J% up to the error. Press enter or return to continue, and then fix your^^J% Asymptote code when this run is done. }% \fi% \fi% } \def\FVE@asypicture{\immediate\closeout\asy@OutFile\endgroup% \@esphack% \ifASYPIC@flush% \asyfilechangedtrue% \else% \ASYPICcomparefiles{\@asypicturename}{\@tempasyfile}% \fi% \ifasyfilechanged% \IfFileExists{\@asypicturename.png}% {\deletefile{\@asypicturename.png}}{}% \IfFileExists{\@asypicturename.pdf}% {\deletefile{\@asypicturename.pdf}}{}% \IfFileExists{\@asypicturename.eps}% {\deletefile{\@asypicturename.eps}}{}% \copyfile{\@tempasyfile.asy}{\@asypicturename.asy}% \ASYPIC@runasy% \fi% \asyset{graphic options}% % Avoid giving "file does not exist" errors. \chardef\previousinteractionmode=\interactionmode% \batchmode% \includegraphics[scale=\asy@scale,angle=\asy@angle]% {\@asypicturename}% \interactionmode=\previousinteractionmode% } \DefineVerbatimEnvironment{asypicture}{asypicture}% {codes={\catcode`@=0},tabsize=4} %\AtEndDocument{\deletefile{\@tempasyfile.asy}} \ifshellescape\else \AtEndDocument{\closeout\ASYPIC@shell} \fi \makeatother % \end{macrocode} %\iffalse % %\fi % \Finale