Open zhuozhixin opened 1 year ago
这个项目的初衷是展示公式,展示图片应该由用户程序来完成,也建议用户程序只用这个项目来展示公式(比如通过富文本的方式将公式绘制代理到这个库),所以 \includegraphics 一直没实现。但是如果一定要实现,可以通过以下步骤来完成:
Graphics2D
接口添加绘制图片的函数,比如:/** `imagePath` 为图片的路径,options 为绘制图片的选项(大小、颜色 filter 等) */
drawImage(const std::string& imagePath, ImageDrawOptions options);
class ImageBox : public Box {
...
// 在 draw 方法中调用 `drawImage`
void draw(Graphics2D& g2, float x, float y) override;
}
class ImageAtom : public Atom {
...
// 在这个方法中创建 `ImageBox`
void createBox(Env& env) override;
}
includegraphics
命令: macro(includegraphics) {
....
return ImageAtom(...);
}
platform
目录中)中实现之前定义的 drawImage
接口这里要注意到,image 可能未被下载或 decode,所以在绘制时可能需要先进行准备工作,等这些工作完成之后再通过回调重新绘制。includegraphics
命令相关的参数可查阅 Inserting Images。
有些实验图不能完全用纯代码绘制
To my knowledge, MicroTeX doesn't currently support "drawing" in TeX with something like tikz/pgf at all, so you'd need to use images for everything.
这个项目的初衷是展示公式,展示图片应该由用户程序来完成,也建议用户程序只用这个项目来展示公式(比如通过富文本的方式将公式绘制代理到这个库),所以 \includegraphics 一直没实现。但是如果一定要实现,可以通过以下步骤来完成:
- 在
Graphics2D
接口添加绘制图片的函数,比如:/** `imagePath` 为图片的路径,options 为绘制图片的选项(大小、颜色 filter 等) */ drawImage(const std::string& imagePath, ImageDrawOptions options);
- 实现一个 Box,用来表示一个图片 "Box",比如:
class ImageBox : public Box { ... // 在 draw 方法中调用 `drawImage` void draw(Graphics2D& g2, float x, float y) override; }
- 实现一个 Atom,用来表示一个图像命令,比如:
class ImageAtom : public Atom { ... // 在这个方法中创建 `ImageBox` void createBox(Env& env) override; }
- 实现
includegraphics
命令:macro(includegraphics) { .... return ImageAtom(...); }
- 最后在你需要的图形后端(graphics backend,在
platform
目录中)中实现之前定义的drawImage
接口
感谢感谢!
另外建议使用 openmath
分支,代码结构更合理了,也增加了很多新特性。master
分支维护很少了。
主要应用场景是化学和物理试卷中,有些实验图不能完全用纯代码绘制,麻烦大佬提供下思路,提前感谢。