我正在 Jekyll 中开发一个插件,它会插入一个名为
latex
的新 Liquid 标签(块标签)。它的目的是通过这种方式在帖子源文件中插入一块 LaTeX 源代码:
... post file contents ...
{% latex density=300 usepackages=pstricks-all, %}
\pspicture(5,5)
\psframe(0,0)(5,5) \psline(0,0)(5,5) \psline(0,5)(5,0)
\endpspicture
{% endlatex %}
... post file contents ...
编译后,输出帖子将包含
<img>
标签而不是 Liquid Tag 块,并且 LaTeX 源将通过 latex
、dvips
、convert
的链式执行进行编译。所以它将依赖于外部程序(TexLive 和 ImageMagick)。
到目前为止,我还没有发现所解释的任何问题。我可以将 LaTeX 块放入临时文件中,最后将其编译为 PNG。渲染的文件必须放在帖子的同一文件夹中。
但我被困住了:我想将生成的 PNG 图像放入
destination
输出文件夹内的此文件夹中。定义站点配置变量来定义文件夹(事实上,我就是这样做的),也没有在其中放置文件。问题很简单:我可以写入source
文件夹,但生成的文件不会复制到destination
文件夹。
我知道原因了:Jekyll 先生成,后渲染。复制过程发生在渲染部分之前,因此生成的文件不会被复制。
我找到了这个SO条目:“如何从Jekyll中的Liquid块生成文件?”,但答案感觉不对:您必须为要复制的文件进行两遍构建。
还发现“使用 Jekyll 插件在 _site 中生成文件”,但这不适用,因为我不想通过模板渲染文档。
我一直计划的解决方案是这样的:
Site
宽方法,例如:
class Site
def generate_latex_adds
// Code that copies the generated files to destination folders
end
end
self.generate_latex_adds
和
site_process.rb
调用之前在
self.cleanup
脚本中添加
self.write
调用该方法。
但我觉得修改不对site_process.rb
site_process.rb
的手动编辑。我知道这可能是一种常见情况和常见解决方案,但我想知道是否有更好的方法可以在不修改核心文件的情况下推迟生成文件的副本。我想让插件保持简单:只需将插件文件复制到
_plugins
目录即可。有什么想法吗?
编辑:我对实际代码的推理更感兴趣。我是想学习,不是求代码解决方案。
使用Jekyll::StaticFile
类。我错过了那堂课(旁注:仔细阅读文档)。 当您将此类的一个对象添加到
site.static_files
数组时,您就将该文件标记为渲染过程完成后等待复制。事实上,此类文件的复制是在
site.write
过程中完成的。查看 Jekyll 安装中的 site_process.rb
文件。这个类的使用很简单。当您需要标记文件以供将来复制时,只需执行如下代码即可:
site.static_files << Jekyll::StaticFile.new(site, site.source, path, filename)
path
和
filename
的位置取决于文件在 src
文件夹中的位置。就这样:您在 src
文件夹中生成文件,将它们标记为待复制,然后让 Jekyll 完成剩下的工作。
完全没有修改
site_process.rb
!
您可以在 GitHub 上查看生成的 LaTeX -> PNG 液体标签代码:https://gitlab.com/felix.galindo/jekyll-liquid-latex-plugin我还在那里实现了一种清理方法,以消除已修改和重建的帖子中生成的孤立文件。