我对 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
此处的文件,输出如下图所示(文本颜色是自定义的):
当我尝试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 中使用这些颜色:Purple
cmyk(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 为你完成所有工作,你可以尝试以下操作:
- 从
asymptote
包切换到asypictureB
包裹(TeX 命令不同,但实际的 Asymptote 代码是相同的。)这允许您使用纯粹可扩展TeX 宏直接在 Asymptote 代码中通过在它们前面加上@
而不是 来使用\
。与该asymptote
包相比,它还有其他优点和缺点;这些在asypictureB 文档。 - 完成第 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
包并实现这一点,我一定会投赞成票。