从 Asymptote 中的数组加载字体

从 Asymptote 中的数组加载字体

上一个问题: 在 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));
}

相关内容