1

For some reason I can't draw two pictures onto currentpicture in Asymptote. Currently I have

\documentclass{article}

\usepackage[inline]{asymptote}

\begin{document}

\begin{asy}[width=0.7\textwidth]
import three;

string d = "$";

triple A = (0,0,0); // Vertices of a cube
triple B = (0,1,0);
triple C = (-1,1,0);
triple D = (-1,0,0);

transform3 sd = shift(0,0,-1);

triple Ap = sd * A;
triple Bp = sd * B;
triple Cp = sd * C;
triple Dp = sd * D;

void drawCube(picture pic, string[] labels) {
    draw(pic,A--B--C--Cp--Bp--Ap--A--B--Bp);
    draw(pic,B--C);
    draw(pic,A--D--C);
    draw(pic,Ap--Dp--D,dashed); // behind the cube
    draw(pic,Dp--Cp,dashed);

    if (labels.length > 0) {
        label(pic, d + labels[0] + d, A, NW);
        label(pic, d + labels[1] + d, B, N);
        label(pic, d + labels[2] + d, C, NE);
        label(pic, d + labels[3] + d, D, N);
        label(pic, d + labels[4] + d, Ap, SW);
        label(pic, d + labels[5] + d, Bp, S);
        label(pic, d + labels[6] + d, Cp, SE);
        label(pic, d + labels[7] + d, Dp, S);
    }
}

picture start; // first picture (the one with the cube)
size(start, 100);

string[] start_labels = {"A","B","C","D","A'","B'","C'","D'"};
drawCube(start, start_labels);

picture step1; // second figure, the one with the dashed line
size(step1, 100);

triple corner1 = (0,0,0);
triple corner2 = (-1,1,-1);

draw(step1, corner1--corner2,dashed);
dot(step1, corner1);
dot(step1, corner2);

add(step1.fit(), (-2,0), N); // LINE 1
add(start.fit(), (0,0), N); // LINE 2

label("Starting position", (0,0),S);
label("Choose a pair of vertices: $2$ ways", (-2,0), S);

\end{asy}

\end{document}

If this is the file "test.tex", then the building script file is

pdflatex test.tex
asy *.asy
pdflatex test.tex
pdflatex test.tex

I'd like there to be a figure with a dashed line on the left and a cube on the right. However, when I run Asymptote on this file, I get two cubes!

two cubes side by side

I tried switching the lines labeled "LINE 1" and "LINE 2", which leads to the other picture being drawn twice instead:

two lines side by side

Obviously this is quite frustrating. How can this be fixed?

Edit: This is compiled with pdflatex, which outputs an .asy file in the same directory, then with asy. The file is the same except for some asydef code which doesn't affect it and the following added to the beginning:

if(!settings.multipleView) settings.batchView=false;
settings.tex="pdflatex";
settings.inlinetex=true;
deletepreamble();
defaultfilename="test-1";
if(settings.render < 0) settings.render=4;
settings.outformat="";
settings.inlineimage=true;
settings.embed=true;
settings.toolbar=false;
viewportmargin=(2,2);

Also, this line is at the end:

size(241.49895pt,0,keepAspect=true);
  • Welcome to TeX-SE! I ran your code with asy and fail to reproduce your observation. How do you compile your code? – user121799 Jun 5 at 20:45
  • It's inside a \begin{asy} ... \end{asy} environment, which is compiled with pdflatex, then asy, then pdflatex. I examined the intermediate asy file and it's a bit different. The main differences are 1. some settings modifications which I assume are prepended by the asy environment 2. a bunch of stuff from asydef on top 3. a final command specifying the figure size. I'm guessing that's because I specifies the asy's width. I've put the header stuff outputted by pdflatex into the question now. – Ovinus Real Jun 5 at 20:52
  • Well, in that case please post the full code, i.e. including the embedding LaTeX document, and specify in detail how you compile. – user121799 Jun 5 at 20:59
  • I have edited the question as you asked – Ovinus Real Jun 5 at 21:20
1

I will be happy to delete this, but maybe it helps. I could not compile your file but when I use the asypictureB package, which has the additional advantage that one only needs to run pdflatex -shell-escape <file> (and no separate asy),

\documentclass{article}
\usepackage{asypictureB}
\begin{document}

\begin{asypicture}{name=Ovinus}
import three;

string d = "$";

triple A = (0,0,0); // Vertices of a cube
triple B = (0,1,0);
triple C = (-1,1,0);
triple D = (-1,0,0);

transform3 sd = shift(0,0,-1);

triple Ap = sd * A;
triple Bp = sd * B;
triple Cp = sd * C;
triple Dp = sd * D;

void drawCube(picture pic, string[] labels) {
    draw(pic,A--B--C--Cp--Bp--Ap--A--B--Bp);
    draw(pic,B--C);
    draw(pic,A--D--C);
    draw(pic,Ap--Dp--D,dashed); // behind the cube
    draw(pic,Dp--Cp,dashed);

    if (labels.length > 0) {
        label(pic, d + labels[0] + d, A, NW);
        label(pic, d + labels[1] + d, B, N);
        label(pic, d + labels[2] + d, C, NE);
        label(pic, d + labels[3] + d, D, N);
        label(pic, d + labels[4] + d, Ap, SW);
        label(pic, d + labels[5] + d, Bp, S);
        label(pic, d + labels[6] + d, Cp, SE);
        label(pic, d + labels[7] + d, Dp, S);
    }
}

picture start; // first picture (the one with the cube)
size(start, 100);

string[] start_labels = {"A","B","C","D","A'","B'","C'","D'"};
drawCube(start, start_labels);

picture step1; // second figure, the one with the dashed line
size(step1, 100);

triple corner1 = (0,0,0);
triple corner2 = (-1,1,-1);

draw(step1, corner1--corner2,dashed);
dot(step1, corner1);
dot(step1, corner2);

add(step1.fit(), (-2,0), N); // LINE 1
add(start.fit(), (0,0), N); // LINE 2

label("Starting position", (0,0),S);
label("Choose a pair of vertices: $2$ ways", (-2,0), S);

\end{asypicture}

\end{document}

I get

enter image description here

I know that the overlapping text should not be there but at least the issue you refer to does not arise.

  • Thank you so much! If I had known about this package a month ago it would have saved me so much time... Do you know if asydef works with asypicture? – Ovinus Real Jun 5 at 22:12
  • @OvinusReal Sorry, I do not. (And you're welcome. ;-) – user121799 Jun 5 at 22:13
  • One more question: how should I set the width of the figure to specified width? with the asy environment you can do [width=x], but it looks like you can't do that here. Should I use a resizebox? – Ovinus Real Jun 5 at 22:18
  • @OvinusReal This is explained in section 3.2 of the asypictureB manual. (texdoc asypictureB). This is one of the reason why I really like asypictureB so much: you can control this from the embedding document (if you want). All you need to do is \asyset{mysize/.style = {width=6cm, height=4cm}} and then \begin{asypicture}{name=picturename, mysize} or, equivalently, \begin{asypicture}{name=picturename, width=6cm, height=4cm}. (There is one more thing: the latest TikZ version has also perspective views (but not the other 3d features of asymptote)). – user121799 Jun 5 at 22:21
  • Thanks again, I'll peruse through that manual – Ovinus Real Jun 5 at 22:22

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.