MicroTeX icon indicating copy to clipboard operation
MicroTeX copied to clipboard

添加插入图片 \includegraphics 命令支持,需要在哪些地方补充代码才能实现

Open zhuozhixin opened this issue 2 years ago • 5 comments

主要应用场景是化学和物理试卷中,有些实验图不能完全用纯代码绘制,麻烦大佬提供下思路,提前感谢。

zhuozhixin avatar Jun 14 '23 02:06 zhuozhixin

这个项目的初衷是展示公式,展示图片应该由用户程序来完成,也建议用户程序只用这个项目来展示公式(比如通过富文本的方式将公式绘制代理到这个库),所以 \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 接口

NanoMichael avatar Jun 14 '23 07:06 NanoMichael

这里要注意到,image 可能未被下载或 decode,所以在绘制时可能需要先进行准备工作,等这些工作完成之后再通过回调重新绘制。includegraphics 命令相关的参数可查阅 Inserting Images

NanoMichael avatar Jun 14 '23 07:06 NanoMichael

有些实验图不能完全用纯代码绘制

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.

sp1ritCS avatar Jun 14 '23 11:06 sp1ritCS

这个项目的初衷是展示公式,展示图片应该由用户程序来完成,也建议用户程序只用这个项目来展示公式(比如通过富文本的方式将公式绘制代理到这个库),所以 \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 接口

感谢感谢!

zhuozhixin avatar Jun 15 '23 12:06 zhuozhixin

另外建议使用 openmath 分支,代码结构更合理了,也增加了很多新特性。master 分支维护很少了。

NanoMichael avatar Jun 16 '23 03:06 NanoMichael