Asymptote (XeLaTeX):使用自定义颜色/从外部文件调用绘图函数

Asymptote (XeLaTeX):使用自定义颜色/从外部文件调用绘图函数

我对 Asymptote 还不太熟悉,不过在 LaTeX 中处理矢量图形很不错。具体来说,我使用的是 XeLaTeX。

我想做的是将矢量图的颜色更改为我使用命令\definecolor(使用xcolor包)定义的颜色,以及之前使用dvipsnames选项定义的其他颜色。另外,我尝试不将 Asymptote 代码放在我正在处理的 LaTeX 文件中,因为它很大,并有机会在未来的文档中重复使用它。不幸的是,我尝试了,但没有成功。

我部分地让 Asymptote 使用像red和这样的颜色yellow(没有选项的标准颜色xcolor),并使用附加到文件的代码.tex,如下所示:

\documentclass[12pt]{article}

\usepackage{geometry}
\geometry{paperwidth=4in, paperheight=3in,margin=2cm}

\usepackage{parskip}

\usepackage[dvipsnames]{xcolor}
\definecolor{myColor}{HTML}{B28B3C}

\usepackage[inline]{asymptote}

\begin{asydef}
  settings.outformat = "pdf";
  import pstoedit;

  void star(pen color=black) {
    currentpen += 0.5bp;
    currentpen += squarecap;
    currentpen += miterjoin;
    currentpen += linetype(" ",false);
    fill((691.141,600.863)--(703.473,569.43)--(743.625,569.496)
        --(711.098,550.133)--(723.578,518.742)--(691.141,538.207)
        --(658.703,518.742)--(671.184,550.133)--(638.656,569.496)
        --(678.805,569.43)--cycle,color+evenodd);
  }
\end{asydef}

\begin{document}
  \pagenumbering{gobble}
  \textcolor{myColor}{\textbf{A text with the custom color!}}\\[1cm]
  \begin{minipage}{2.5cm}
    \begin{asy}[width=2.5cm]
      star(color=blue);
    \end{asy}
  \end{minipage}
  \hfill
  \begin{minipage}{2.5cm}
    \begin{asy}[width=2.5cm]
      //star(color=Purple);
      //star(color=myColor);
      star(color=red);
    \end{asy}
  \end{minipage}
\end{document}

这是 latexmkrc 文件(用于latexmk编译):

sub asy {return system("asy \"$_[0]\"");}
add_cus_dep("asy","eps",0,"asy");
add_cus_dep("asy","pdf",0,"asy");
add_cus_dep("asy","tex",0,"asy");

值得一提的是,Asymptote 中的评论是//

编译.tex此处的文件,输出如下图所示(文本颜色是自定义的):

编译后的 MWE 输出(原样)

当我尝试latexmk -xelatex star.tex使用dvipsnames或自定义颜色对第二颗星进行编译(即仅留下三行中的一行未注释)时,出现以下错误:

star-2.asy: 29.12: no matching variable 'myColor' <-- Custom color
star-2.asy: 28.12: no matching variable 'Purple'  <-- dvipsnames color

事实上,当我尝试将 的内容放入\begin{asydef}...\end{asydef}外部文件(例如code.asy)并将其与指令 链接时,我甚至会遇到同样的错误\asyinclude{code.asy}。这就是您在 中看到代码的原因star.tex

有没有办法消除这些错误以完成我尝试执行的任务?如能提供任何帮助/线索,我将不胜感激。

答案1

您无法通过在 TeX 代码中定义颜色来实现这一点。但是,有一种方法可以获取您想要的自定义颜色。使用html 颜色转换器并输入#B28B3C您的自定义颜色,看起来该颜色的 cmyk 代码是。同样,如果您从颜色转换器中cmyk(0%, 22%, 66%, 30%)请求,您将获得 cmyk 代码。您可以通过将以下几行添加到您的环境中来在 Asymptote 中使用这些颜色:Purplecmyk(0%, 100%, 0%, 50%)asydef

pen myColor = cmyk(0, 0.22, 0.66, 0.30);
pen Purple = cmyk(0, 1.00, 0, 0.50);

这可能是您能获得的最简单的解决方案。

如果你真的希望 TeX 为你完成所有工作,你可以尝试以下操作:

  1. asymptote包切换到asypictureB包裹(TeX 命令不同,但实际的 Asymptote 代码是相同的。)这允许您使用纯粹可扩展TeX 宏直接在 Asymptote 代码中通过在它们前面加上@而不是 来使用\。与该asymptote包相比,它还有其他优点和缺点;这些在asypictureB 文档
  2. 完成第 1 步后,将其插入到xcolor包中,并确保每次定义颜色(包括包中预定义的颜色)时,纯粹可扩展宏被定义,可以被 Asymptote 解析。例如,在 之后\definecolor{myColor}{HTML}{B28B3C},应该存在一个命令\myColorAsy或类似命令,它将扩展为cmyk(0, 0.22, 0.66, 0.30)rgb(178/255, 139/255, 60/255)。然后,当您想在 Asymptote 代码中使用此颜色时,请使用@myColorAsy。请注意,每次使用它时都会重新创建颜色,因此从技术上讲,Asymptote 代码的运行速度会更慢;但在大多数情况下,差异是不可察觉的。

就我个人而言,我认为第 2 步的工作量远远超过了它的价值。但如果有志之士愿意给出一个纯粹的 (La)TeX 解决方案来解释如何接入该xcolor包并实现这一点,我一定会投赞成票。

相关内容