LaTeX
usage ¶Asymptote
comes with a convenient LaTeX
style file
asymptote.sty
(v1.36 or later required) that makes LaTeX
Asymptote
-aware. Entering Asymptote
code
directly into the LaTeX
source file, at the point where it is
needed, keeps figures organized and avoids the need to invent new file
names for each figure. Simply add the line
\usepackage{asymptote}
at the beginning of your file
and enclose your Asymptote
code within a
\begin{asy}...\end{asy}
environment. As with the
LaTeX
comment
environment, the \end{asy}
command
must appear on a line by itself, with no trailing commands/comments.
A blank line is not allowed after \begin{asy}
.
The sample LaTeX
file below, named latexusage.tex
, can
be run as follows:
latex latexusage asy latexusage-*.asy latex latexusage
or
pdflatex latexusage asy latexusage-*.asy pdflatex latexusage
To switch between using inline Asymptote code with latex
and
pdflatex
you may first need to remove the files latexusage-*.tex
.
An even better method for processing a LaTeX
file with embedded
Asymptote
code is to use the latexmk
utility from
after putting the contents of
https://raw.githubusercontent.com/vectorgraphics/asymptote/HEAD/doc/latexmkrc
in a file latexmkrc
in the same directory. The command
latexmk -pdf latexusage
will then call Asymptote
automatically, recompiling only the figures
that have changed. Since each figure is compiled in a separate
system process, this method also tends to use less memory.
To store the figures in a separate directory named asy
, one can define
\def\asydir{asy}
in latexusage.tex
.
External Asymptote
code can be included with
\asyinclude[<options>]{<filename.asy>}
so that latexmk
will recognize when the code is changed. Note that
latexmk
requires perl
, available from https://www.perl.org/.
One can specify width
, height
, keepAspect
,
viewportwidth
, viewportheight
, attach
, and inline
.
keyval
-style options to the asy
and asyinclude
environments.
Three-dimensional PRC files may either be embedded within
the page (the default) or attached as annotated (but printable)
attachments, using the attach
option and the attachfile2
(or older attachfile
) LaTeX
package.
The inline
option generates
inline LaTeX
code instead of EPS or PDF
files. This makes 2D LaTeX symbols visible to the
\begin{asy}...\end{asy}
environment. In this mode,
Asymptote correctly aligns 2D LaTeX symbols defined outside of
\begin{asy}...\end{asy}
, but treats their size as zero; an
optional second string can be given to Label
to provide an
estimate of the unknown label size.
Note that if the latex
TeX engine is used with the
inline
option, labels might not show up in DVI
viewers that cannot handle raw PostScript
code. One can use
dvips
/dvipdf
to produce PostScript
/PDF
output (we recommend using the modified version of dvipdf
in
the Asymptote
patches directory, which accepts the dvips -z
hyperdvi option).
Here now is latexusage.tex
:
\documentclass[12pt]{article} % Use this form to include EPS (latex) or PDF (pdflatex) files: %\usepackage{asymptote} % Use this form with latex or pdflatex to include inline LaTeX code by default: \usepackage[inline]{asymptote} % Use this form with latex or pdflatex to create PDF attachments by default: %\usepackage[attach]{asymptote} % Enable this line to support the attach option: %\usepackage[dvips]{attachfile2} \begin{document} % Optional subdirectory for latex files (no spaces): \def\asylatexdir{} % Optional subdirectory for asy files (no spaces): \def\asydir{} \begin{asydef} // Global Asymptote definitions can be put here. settings.prc=true; import three; usepackage("bm"); texpreamble("\def\V#1{\bm{#1}}"); // One can globally override the default toolbar settings here: // settings.toolbar=true; \end{asydef} Here is a venn diagram produced with Asymptote, drawn to width 4cm: \def\A{A} \def\B{\V{B}} %\begin{figure} \begin{center} \begin{asy} size(4cm,0); pen colour1=red; pen colour2=green; pair z0=(0,0); pair z1=(-1,0); pair z2=(1,0); real r=1.5; path c1=circle(z1,r); path c2=circle(z2,r); fill(c1,colour1); fill(c2,colour2); picture intersection=new picture; fill(intersection,c1,colour1+colour2); clip(intersection,c2); add(intersection); draw(c1); draw(c2); //draw("$\A$",box,z1); // Requires [inline] package option. //draw(Label("$\B$","$B$"),box,z2); // Requires [inline] package option. draw("$A$",box,z1); draw("$\V{B}$",box,z2); pair z=(0,-2); real m=3; margin BigMargin=Margin(0,m*dot(unit(z1-z),unit(z0-z))); draw(Label("$A\cap B$",0),conj(z)--z0,Arrow,BigMargin); draw(Label("$A\cup B$",0),z--z0,Arrow,BigMargin); draw(z--z1,Arrow,Margin(0,m)); draw(z--z2,Arrow,Margin(0,m)); shipout(bbox(0.25cm)); \end{asy} %\caption{Venn diagram}\label{venn} \end{center} %\end{figure} Each graph is drawn in its own environment. One can specify the width and height to \LaTeX\ explicitly. This 3D example can be viewed interactively either with Adobe Reader or Asymptote's fast OpenGL-based renderer. To support {\tt latexmk}, 3D figures should specify \verb+inline=true+. It is sometimes desirable to embed 3D files as annotated attachments; this requires the \verb+attach=true+ option as well as the \verb+attachfile2+ \LaTeX\ package. \begin{center} \begin{asy}[height=4cm,inline=true,attach=false,viewportwidth=\linewidth] currentprojection=orthographic(5,4,2); draw(unitcube,blue); label("$V-E+F=2$",(0,1,0.5),3Y,blue+fontsize(17pt)); \end{asy} \end{center} One can also scale the figure to the full line width: \begin{center} \begin{asy}[width=\the\linewidth,inline=true] pair z0=(0,0); pair z1=(2,0); pair z2=(5,0); pair zf=z1+0.75*(z2-z1); draw(z1--z2); dot(z1,red+0.15cm); dot(z2,darkgreen+0.3cm); label("$m$",z1,1.2N,red); label("$M$",z2,1.5N,darkgreen); label("$\hat{\ }$",zf,0.2*S,fontsize(24pt)+blue); pair s=-0.2*I; draw("$x$",z0+s--z1+s,N,red,Arrows,Bars,PenMargins); s=-0.5*I; draw("$\bar{x}$",z0+s--zf+s,blue,Arrows,Bars,PenMargins); s=-0.95*I; draw("$X$",z0+s--z2+s,darkgreen,Arrows,Bars,PenMargins); \end{asy} \end{center} \end{document}