我正在尝试编译以下文档,这是渐近线文档第 7 章中示例文档的略微修改版本(https://asymptote.sourceforge.io/doc/LaTeX-usage.html#LaTeX-usage)。
\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.
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}
testing, testing, testing
\end{document}
%%% Local Variables:
%%% mode: latex
%%% TeX-master: t
%%% End:
我的 latexmkrc 文件中有这个:
add_cus_dep("asy","eps",0,"asy2eps");
add_cus_dep("asy","pdf",0,"asy2pdf");
add_cus_dep("asy","tex",0,"asy2tex");
sub asy2eps { return asy2x( $_[0], 'eps' ); }
sub asy2pdf { return asy2x( $_[0], 'pdf' ); }
sub asy2tex { return asy2x( $_[0], 'tex' ); }
sub asy2x {
# system("echo > '$_[0].log'");
# print "$_[1] $_[0]\n";
system("/tmp/printargs.sh -vv -f '$_[1]' '$_[0]'");
# system("asy --help");
my $ret = system("asy -vv -f '$_[1]' '$_[0]' &> '$_[0].log'");
# print "$ret\n";
my $FH = new FileHandle;
open $FH, "$_[0].log";
%imp = ();
while (<$FH>) {
if (/^(Including|Loading) .* from (.*)\s*$/) {
my $import = $2;
$imp{$import} = 1;
}
elsif ( /^error/ || /^.*\.asy: \d/ ) {
warn "==Message from asy: $_";
$ret = 1;
}
elsif ( /^kpsewhich / || /^Processing / || /^Using /
|| /^Welcome / || /^Wrote /|| /^cd /|| /^gs /
) {
}
else {
warn "==Message from asy: $_";
}
}
close $FH;
# For latexmk 4.48
rdb_set_source( $rule, keys %imp );
return $ret;
}
push @generated_exts, "asy";
push @generated_exts, "prc";
push @generated_exts, "pre";
我正在使用以下方式进行编译:
我使用以下命令运行它:
latexmk -diagnostics -dvi- -ps- -pdf latexusage
我已将输出粘贴到这里:https://justpaste.it/23t6e
我不明白为什么 latexmk 不能编译这个可以通过运行 pdflatex、asy、pdflatex 轻松创建的简单文档(当然我正试图让它适用于其他更复杂的文档)。
另一件我不明白的事情是,如果我明确禁用它们,为什么 latexmk 仍坚持生成 dvi 和 ps 文档。
谢谢,埃德温。
答案1
我使用了更简单的 latexmkrc 文件:
add_cus_dep("asy","eps",0,"asy2x");
add_cus_dep("asy","pdf",0,"asy2x");
add_cus_dep("asy","tex",0,"asy2x");
sub asy2x {return system("asy '$_[0]'"); }
我使用的命令行是
latexmk -pdf test.tex
其中 test.tex 是示例文件。
答案2
有几件事阻碍了 latexmk 正常运行。
我的系统确实安装了旧版本的 asymptote。因此,我更改了 latexmkrc 文件中的系统调用,以包含新 asymptote 二进制文件的完整路径,尽管它在 PATH 环境变量中是第一个,因此新 asymptote 应该已经被使用。
另外,我最初是通过 ssh 连接运行 latexmk 的,由于 asy 需要创建一个窗口来生成图形,这会导致问题,尤其是对于似乎需要 OpenGL 库的 3D 绘图。为了能够通过 ssh 连接运行 asy(以及 latexmk),必须使用选项 调用 asy -offscreen
,这又需要在系统上安装 OSMesa 库。
我还必须对 latexmkrc 文件中 asy 的系统调用进行另一项更改,因为“&>”被误解了。这导致 asy 在后台执行,而日志文件已创建但仍然为空。这导致执行在运行 asy 后立即完成。我对 Perl 了解甚少,但似乎 while 循环内的代码因此没有执行。所以我将该行更改为:
my $ret = system("/home/adf/usrnam/opt/bin/asy -vv -f '$_[1]' '$_[0]' > '$_[0].log' 2>&1");
编辑:
我正在运行 Ubuntu 18.04。我不知道对 '&>' 的误解是否与我系统上的 bash 或 Perl 的配置有关。