上一个问题: 在 Asymptote 中更改字体。@marmot 成功解决了两种字体的情况,但实际上我需要从不同字体的字母生成路径,这些字体的系统名称存储在数组中。使用两种字体的情况的逻辑,我得出了以下结论:
import settings;
import fontsize;
settings.tex="lualatex";
outformat="pdf";
size(9cm);
defaultpen(fontsize(10pt));
defaultpen(0.1);
string[] font_names = {"Courier New", "Arial"};
texpreamble("\usepackage{fontspec}");
for (int i = 0; i < font_names.length; ++i)
{
string preamble = "\newfontfamily\myfont" + (string)i + "{" + font_names[i] +"}";
string tp = "{\myfont" + (string)i + " a}";
write(preamble);
write(tp);
texpreamble(preamble);
draw(shift((i + 1) % 5, -ceil((i + 1) / 5)) * scale(0.1) * texpath(tp));
}
待办问题:我尝试了以下操作,但无法切换字体:
import settings;
import fontsize;
settings.tex="lualatex";
outformat="pdf";
size(9cm);
defaultpen(fontsize(10pt));
defaultpen(0.1);
texpreamble("\usepackage{fontspec}\setmainfont{Courier New}");
draw(scale(0.1) * texpath("text"));
texreset();
texpreamble("\usepackage{fontspec}\setmainfont{Arial}");
draw(shift(3, 0) * scale(0.1) * texpath("text"));
具体是texreset()
做什么的?
答案1
我找到了解决方案。问题是 TeX 不支持宏名称中的数字,所以我现在根据字体名称索引的二进制表示来形成字体标识符。
import settings;
import fontsize;
settings.tex="lualatex";
outformat="pdf";
size(9cm);
defaultpen(fontsize(10pt));
defaultpen(0.1);
string bin(int n)
{
int i;
string res;
for (i = intMax; i > 0; i = (int)(i / 2)) {
if (AND(n, i) != 0) { res += "a"; } else { res += "b"; } }
return substr(res, 48);
}
string[] font_names = {"Courier New", "Arial"};
texpreamble("\usepackage{fontspec}");
for (int i = 0; i < font_names.length; ++i)
{
string preamble = "\newfontfamily\myfont" + bin(i) + "{" + font_names[i] +"}";
string tp = "{\myfont" + bin(i) + " o}";
write(preamble);
write(tp);
texpreamble(preamble);
draw(shift((i + 1) % 5, -ceil((i + 1) / 5)) * scale(0.1) * texpath(tp));
}