Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
zhuozhixin opened this issue Jun 14, 2023 · 5 comments

Comments

@zhuozhixin
Copy link

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

@NanoMichael
Copy link
Owner

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

NanoMichael commented Jun 14, 2023

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

@sp1ritCS
Copy link
Contributor

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

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
Copy link
Author

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants