3

Doing my first steps with Asymptote (seems to be a great tool) I ran into the following problem. I usually try to put my graphics (tikz) into separate files to be more flexible. So I would like to handle the asy-graphics as well. But, the \ASYinput macro leads to the error message ! File ended while scanning use of \next. Is there any (simple) way to get this running?

\documentclass{scrartcl}
\usepackage{asymptote}

\newcommand{\ASYinput}[1]{%
   \begin{asy}
    \input{#1.asy}
   \end{asy}
}

\newcommand{\ASYinputx}[1]{%
    \input{#1.asy}
}

\begin{document}
blabla

\ASYinputx{test1}

blabla

\ASYinput{test2}

blabla
\end{document}

Here are the two test files.

// test2.asy
 size(10cm);
 draw((0,0)--(2,1));

and

// test1.asy
\begin{asy}
 size(10cm);
 draw((0,0)--(2,1));
\end{asy}
Jürgen
  • 2,160

2 Answers2

6

From the documentation for the asymptote package:

If you have Asymptote code in a separate file, you can include it with the \asyinclude[options]{filename} command.

4

As indicated in this answer, you can't use a TeX command (\input) inside the asy environment; you have to use the asymptote command include.

Moreover, as indicated in this other answer, you can't hide the asy environment in a macro (but, of course, egreg found a solution).

Putting all this together, here's a working code:

\documentclass{scrartcl}
\usepackage{asymptote}

\makeatletter
\newcommand{\asycode}[2][]{%
    \stepcounter{asy}%
    \setkeys{ASYkeys}{#1}%
    \ifASYattach
    \ASYinlinefalse
    \fi
    \ifx\asydir\empty\else
    \def\ASYprefix{\asydir/}%
    \fi
    \immediate\write\AsyPreStream{%
        \noexpand\InputIfFileExists{%
            \ASYprefix\noexpand\jobname-\the\c@asy.pre}{}{}%
    }
    \asy@write@graphic@header
    \immediate\write\AsyStream{\detokenize{#2}}% here asy does the writing
    \asy@finalise@stream
    \asy@input@graphic
}
\makeatother
\newcommand{\ASYinput}[1]{%
    \asycode{include #1;}
}

\newcommand{\ASYinputx}[1]{%
\input{#1.asy}
}

\begin{document}

blabla

\ASYinputx{test1}

blabla

\ASYinput{test2}

blabla
\end{document}

With test1.asy:

\begin{asy}
 size(10cm);
 draw((0,0)--(2,1));
\end{asy}

and test2.asy:

size(10cm);
draw((0,0)--(2,1));

In this case, you can't use filecontents because it adds an empty line at the and of the file which is not accepted by asymptote.

If you want a piece of advice, use tikz!

enter image description here

CarLaTeX
  • 62,716
  • Great! Thanks a lot for this thorough answer. Although I do not understand every step of the new macro, I will use it. Of course. -- Regarding your advice, which is surely welcome: I use TikZ for more than ten years and have about a thousand graphs in my presentations, lecture notes and so on. But, I haven't been successful in creating 'fine' 3-D-pictures of antenna diagrams, mainly due to numerical constraints (even with pgfplots). So I will give Asymptote a try. – Jürgen Mar 09 '17 at 06:40
  • This behavior (not possible to hide macro inside an environment without a true macro like the egreg one) is due to the fact that asy is based on the comments environment. asy has the same limitations. – O.G. Mar 09 '17 at 10:57
  • @Jürgen You're welcome, but for the macro you have to thank egreg! See also what O.G. has just written... – CarLaTeX Mar 09 '17 at 11:05
  • @O.G. Thank you for the explanation! I prefer TikZ even for the mere fact that you do not have to compile in 3 times... – CarLaTeX Mar 09 '17 at 11:08
  • @CarLaTeX We have the choice for graphics solutions... It is also possible to simply use \includegraphics and an appropriate Makefile for a complex process. Or asypictureb... – O.G. Mar 09 '17 at 11:17
  • @O.G. Surely! I have only simple graphics to do, hence for me TikZ is more convenient, I imagine that for more complex ones Asymptote is indispensable... – CarLaTeX Mar 09 '17 at 11:39