帮助创建用于 Asymptote 自动编译的 arara yaml 文件

帮助创建用于 Asymptote 自动编译的 arara yaml 文件

我最近发现了用于创建 3D 图形的 asymptote 包,我已经在我的计算机上安装了可执行版本并配置了 TexStudio 来运行它,只是使用工具>订单> Asymptote 手动完成,因为几个文件的编译设置不一样我使用 Arara 工具,我试图在规则文件夹中编写一个新的 yaml 文件,虽然我发现编译器告诉我它已被执行,但它失败了,我需要一个如何正确编写 yaml 代码的指导......

这是我的尝试..

!config
# Asymptote rule for arara
# author: None
# last edited by: None
# requires arara 3.0+
identifier: asymptote
name: Asymptote
command: <arara> asy @{options} "@{getBasename(file)}.asy"
arguments:
- identifier: style
  flag: <arara> @{parameters.style}
  default: asy
- identifier: options
  flag: <arara> @{parameters.options}

我正在使用此示例代码来实现它:

% arara: pdflatex: {synctex: yes, action: nonstopmode}
% arara: asymptote
% arara: pdflatex: {synctex: yes, action: nonstopmode}

\documentclass[12pt]{article}
\usepackage[inline]{asymptote}

\begin{document}

    \begin{center}
        \begin{asy}[width=0.5\textwidth]
        settings.outformat = "png";
        settings.render = 16;
        settings.prc = false;
        real unit = 2cm;
        unitsize(unit);

        import graph3;

        void drawsafe(path3 longpath, pen p, int maxlength = 400) {
        int length = length(longpath);
        if (length <= maxlength) draw(longpath, p);
        else {
        int divider = floor(length/2);
        drawsafe(subpath(longpath, 0, divider), p=p, maxlength=maxlength);
        drawsafe(subpath(longpath, divider, length), p=p, maxlength=maxlength);
        }
        }

        struct helix {
        path3 center;
        path3 helix;
        int numloops;
        int pointsperloop = 12;
        /* t should range from 0 to 1*/
        triple centerpoint(real t) {
        return point(center, t*length(center));
        }
        triple helixpoint(real t) {
        return point(helix, t*length(helix));
        }
        triple helixdirection(real t) {
        return dir(helix, t*length(helix));
        }
        /* the vector from the center point to the point on the helix */
        triple displacement(real t) {
        return helixpoint(t) - centerpoint(t);
        }
        bool iscyclic() {
        return cyclic(helix);
        }
        }

        path3 operator cast(helix h) {
        return h.helix;
        }

        helix helixcircle(triple c = O, real r = 1, triple normal = Z) {
        helix toreturn;
        toreturn.center = c;
        toreturn.helix = Circle(c=O, r=r, normal=normal, n=toreturn.pointsperloop);
        toreturn.numloops = 1;
        return toreturn;
        }

        helix helixAbout(helix center, int numloops, real radius) {
        helix toreturn;
        toreturn.numloops = numloops;
        from toreturn unravel pointsperloop;
        toreturn.center = center.helix;
        int n = numloops * pointsperloop;
        triple[] newhelix;
        for (int i = 0; i <= n; ++i) {
        real theta = (i % pointsperloop) * 2pi / pointsperloop;
        real t = i / n;
        triple ihat = unit(center.displacement(t));
        triple khat = center.helixdirection(t);
        triple jhat = cross(khat, ihat);
        triple newpoint = center.helixpoint(t) + radius*(cos(theta)*ihat + sin(theta)*jhat);
        newhelix.push(newpoint);
        }
        toreturn.helix = graph(newhelix, operator ..);
        return toreturn;
        }

        int loopfactor = 20;
        real radiusfactor = 1/8;
        helix wrap(helix input, int order, int initialloops = 10, real initialradius = 0.6, int loopfactor=loopfactor) {
        helix toreturn = input;
        int loops = initialloops;
        real radius = initialradius;
        for (int i = 1; i <= order; ++i) {
        toreturn = helixAbout(toreturn, loops, radius);
        loops *= loopfactor;
        radius *= radiusfactor;
        }
        return toreturn;
        }

        currentprojection = perspective(12,0,6);

        helix circle = helixcircle(r=2, c=O, normal=Z);

        /* The variable part of the code starts here. */
        int order = 1;    // This line varies.
        real helixradius = 0.5;
        real safefactor = 1;
        for (int i = 1; i < order; ++i)
        safefactor -= radiusfactor^i;
        real saferadius = helixradius * safefactor;

        helix todraw = wrap(circle, order=order, initialradius = helixradius);    // This line varies (optional loopfactor parameter).

        surface torus = surface(Circle(c=2X, r=0.99*saferadius, normal=-Y, n=32), c=O, axis=Z, n=32);
        material toruspen = material(diffusepen=gray, ambientpen=white);
        draw(torus, toruspen);

        drawsafe(todraw, p=0.5purple+linewidth(1pt));  // This line varies (linewidth only).

        \end{asy}
    \end{center}
\end{document}

当编译过程启动但返回操作失败时......

Running PDFLaTeX...

This is pdfTeX, Version 3.14159265-2.6-1.40.19 (MiKTeX 2.9.6670 64-bit)

entering extended mode

Status: SUCCESS

    Running Asymptote...

    FAILURE

答案1

临时答复(将被取代阿拉拉4.0): 代替

command: <arara> asy @{options} "@{getBasename(file)}.asy"

经过

command: <arara> asy @{options} "@{getBasename(file)}-*.asy"

评论:我个人喜欢使用该asypictureB包,因为它允许通过简单的调用触发所有渐近线编译pdflatex -shell-escape。此外,它还允许您通过将反斜杠替换为来“走私”(扩展)渐近线图中的 LaTeX 宏\@应用于您的示例,TeX 文件将是:

\documentclass[12pt]{article}
\usepackage{asypictureB}

\begin{document}

    \begin{center}
        \begin{asypicture}{name=AsyPlot}
        settings.outformat = "png";
        settings.render = 16;
        settings.prc = false;
        real unit = 2cm;
        unitsize(unit);

        import graph3;

        void drawsafe(path3 longpath, pen p, int maxlength = 400) {
        int length = length(longpath);
        if (length <= maxlength) draw(longpath, p);
        else {
        int divider = floor(length/2);
        drawsafe(subpath(longpath, 0, divider), p=p, maxlength=maxlength);
        drawsafe(subpath(longpath, divider, length), p=p, maxlength=maxlength);
        }
        }

        struct helix {
        path3 center;
        path3 helix;
        int numloops;
        int pointsperloop = 12;
        /* t should range from 0 to 1*/
        triple centerpoint(real t) {
        return point(center, t*length(center));
        }
        triple helixpoint(real t) {
        return point(helix, t*length(helix));
        }
        triple helixdirection(real t) {
        return dir(helix, t*length(helix));
        }
        /* the vector from the center point to the point on the helix */
        triple displacement(real t) {
        return helixpoint(t) - centerpoint(t);
        }
        bool iscyclic() {
        return cyclic(helix);
        }
        }

        path3 operator cast(helix h) {
        return h.helix;
        }

        helix helixcircle(triple c = O, real r = 1, triple normal = Z) {
        helix toreturn;
        toreturn.center = c;
        toreturn.helix = Circle(c=O, r=r, normal=normal, n=toreturn.pointsperloop);
        toreturn.numloops = 1;
        return toreturn;
        }

        helix helixAbout(helix center, int numloops, real radius) {
        helix toreturn;
        toreturn.numloops = numloops;
        from toreturn unravel pointsperloop;
        toreturn.center = center.helix;
        int n = numloops * pointsperloop;
        triple[] newhelix;
        for (int i = 0; i <= n; ++i) {
        real theta = (i % pointsperloop) * 2pi / pointsperloop;
        real t = i / n;
        triple ihat = unit(center.displacement(t));
        triple khat = center.helixdirection(t);
        triple jhat = cross(khat, ihat);
        triple newpoint = center.helixpoint(t) + radius*(cos(theta)*ihat + sin(theta)*jhat);
        newhelix.push(newpoint);
        }
        toreturn.helix = graph(newhelix, operator ..);
        return toreturn;
        }

        int loopfactor = 20;
        real radiusfactor = 1/8;
        helix wrap(helix input, int order, int initialloops = 10, real initialradius = 0.6, int loopfactor=loopfactor) {
        helix toreturn = input;
        int loops = initialloops;
        real radius = initialradius;
        for (int i = 1; i <= order; ++i) {
        toreturn = helixAbout(toreturn, loops, radius);
        loops *= loopfactor;
        radius *= radiusfactor;
        }
        return toreturn;
        }

        currentprojection = perspective(12,0,6);

        helix circle = helixcircle(r=2, c=O, normal=Z);

        /* The variable part of the code starts here. */
        int order = 1;    // This line varies.
        real helixradius = 0.5;
        real safefactor = 1;
        for (int i = 1; i < order; ++i)
        safefactor -= radiusfactor^i;
        real saferadius = helixradius * safefactor;

        helix todraw = wrap(circle, order=order, initialradius = helixradius);    // This line varies (optional loopfactor parameter).

        surface torus = surface(Circle(c=2X, r=0.99*saferadius, normal=-Y, n=32), c=O, axis=Z, n=32);
        material toruspen = material(diffusepen=gray, ambientpen=white);
        draw(torus, toruspen);

        drawsafe(todraw, p=0.5purple+linewidth(1pt));  // This line varies (linewidth only).

        \end{asypicture}
    \end{center}
\end{document}

使用以下方式编译时生成pdflatex -shell-escape

在此处输入图片描述

评论:我没有创建圆环,我所做的只是使用asypictureB

相关内容