NanoMichael / MicroTeX

A dynamic, cross-platform, and embeddable LaTeX rendering library
MIT License
435 stars 74 forks source link

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

Open zhuozhixin opened 1 year ago

zhuozhixin commented 1 year ago

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

NanoMichael commented 1 year ago

这个项目的初衷是展示公式,展示图片应该由用户程序来完成,也建议用户程序只用这个项目来展示公式(比如通过富文本的方式将公式绘制代理到这个库),所以 \includegraphics 一直没实现。但是如果一定要实现,可以通过以下步骤来完成:

/** `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;
}
 macro(includegraphics) {
  ....
  return ImageAtom(...);
}
NanoMichael commented 1 year ago

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

sp1ritCS commented 1 year ago

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

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.

zhuozhixin commented 1 year ago

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

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