1

我正在Jekyll中开发一个插件,它插入一个名为latex. 其目的是以这种方式在 post 源文件中插入一块 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 ...

编译后,输出帖子将包含一个标签而不是 Liquid Tag 块,并且 LaTeX 源代码将通过, ,<img>的链式执行来编译。所以它将取决于外部程序(TexLive 和 ImageMagick)。latexdvipsconvert

到目前为止,我还没有发现任何解释的问题。我可以把 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
    
  • 在and调用之前在脚本中添加self.generate_latex_adds调用该方法。site_process.rbself.cleanupself.write

这可能会解决问题,但我觉得修改site_process.rb. 我正在考虑将此 Liquid Tag 作为 GitHub 项目拉入社区,因此,我必须将此手动编辑记录site_process.rb给此插件的用户。我知道这可能是一种常见的情况和常见的解决方案,但我想知道是否有更好的方法可以在不修改核心文件的情况下推迟生成文件的副本。我想保持插件简单:只需将插件文件复制到_plugins目录中。

有任何想法吗?

编辑:我对实际代码的推理更感兴趣。我想学习,而不是要求代码解决方案。

4

1 回答 1

6

到目前为止,任何人都回答了我的问题,并且我一直在调查这个问题。最后我得到了一个优雅的解决方案:使用Jekyll::StaticFileclass。我错过了那门课(旁注:请仔细阅读文档)。

当您将此类的一个对象添加到数组中时,您将在渲染过程完成site.static_files将此文件标记为待复制。实际上,此类文件的复制是在此过程中完成的。查看 Jekyll 安装中的文件。site.writesite_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 ://github.com/fgalindo/jekyll-liquid-latex-plugin

我还在那里实现了一种清理方法,以从已修改和重建的帖子中消除孤立的生成文件。

于 2013-11-10T14:20:08.500 回答