如何在 Windows 8.1 上使用 Python 过滤器和 Pandoc 将带 tikz 的 md 转换为 html

2024-05-24

我正在尝试使用 Pandoc 过滤器将带有 tikz 图片的 markdown 文件转换为 html。我使用的是 Win 8.1(并且我拥有所有依赖项 - pdflatex、Python 2.7、ImageMagick 和 pandocfilters Python 包)。我正在使用 John MacFarlane 提供的 tikz.py 脚本github https://github.com/jgm/pandocfilters.

我发现了一个类似的question https://github.com/jgm/pandoc/issues/1096Pandoc Google Group 和 John MacFarlane 建议将过滤器包装在 Windows 批处理脚本中(过滤器必须是可执行文件)。这是我的命令行输入(我将在下面提供文件内容)。

pandoc -o temp.html --filter .\tikz.bat -s temp.md

但我不断收到以下错误。

pandoc: Failed reading: satisfyElem

该脚本生成“tikz-images”子文件夹,但它是空的,生成的输出文件 temp.html 也是空的。

我怎样才能让它发挥作用? FWIW,更大的目标是输入文件R Markdown http://rmarkdown.rstudio.com/,但我想先了解 Pandoc Markdown 到 HTML 的过程。

这是文件内容。

tikz.bat

python tikz.py %*

temp.md

\begin{tikzpicture}

\draw [<->](-3,0)--(3,0);
\draw (-2,-.2)--(-2,.2);
\draw (-1,-.2)--(-1,.2);
\draw(0,-.2)--(0,.2);
\draw (1,-.2)--(1,.2);
\draw (2,-.2)--(2,.2);
\node[align=left,below] at (-4.5,-0.2) {Cash flow};
\node[align=left,above] at (-4.5,0.2) {Time period};
\node[align=left,above] at (-2,0.2) {-2};
\node[align=left,above] at (-1,0.2) {-1};
\node[align=left,above] at (0,0.2) {0};
\node[align=left,above] at (1,0.2) {+1};
\node[align=left,above] at (2,0.2) {+2};
\node[align=left,below] at (1,-0.2) {\$100};
\node[align=left,below] at (2,-0.2) {\$100};

\end{tikzpicture}

Can this work?

tikz.py

#!/usr/bin/env python

"""
Pandoc filter to process raw latex tikz environments into images.
Assumes that pdflatex is in the path, and that the standalone
package is available.  Also assumes that ImageMagick's convert
is in the path. Images are put in the tikz-images directory.
"""

import hashlib
import re
import os
import sys
import shutil
from pandocfilters import toJSONFilter, Para, Image
from subprocess import Popen, PIPE, call
from tempfile import mkdtemp

imagedir = "tikz-images"


def sha1(x):
    return hashlib.sha1(x.encode(sys.getfilesystemencoding())).hexdigest()


def tikz2image(tikz, filetype, outfile):
    tmpdir = mkdtemp()
    olddir = os.getcwd()
    os.chdir(tmpdir)
    f = open('tikz.tex', 'w')
    f.write("""\\documentclass{standalone}
             \\usepackage{tikz}
             \\begin{document}
             """)
    f.write(tikz)
    f.write("\n\\end{document}\n")
    f.close()
    p = call(["pdflatex", 'tikz.tex'], stdout=sys.stderr)
    os.chdir(olddir)
    if filetype == 'pdf':
        shutil.copyfile(tmpdir + '/tikz.pdf', outfile + '.pdf')
    else:
        call(["convert", tmpdir + '/tikz.pdf', outfile + '.' + filetype])
    shutil.rmtree(tmpdir)


def tikz(key, value, format, meta):
    if key == 'RawBlock':
        [fmt, code] = value
        if fmt == "latex" and re.match("\\\\begin{tikzpicture}", code):
            outfile = imagedir + '/' + sha1(code)
            if format == "html":
                filetype = "png"
            elif format == "latex":
                filetype = "pdf"
            else:
                filetype = "png"
            src = outfile + '.' + filetype
            if not os.path.isfile(src):
                try:
                    os.mkdir(imagedir)
                    sys.stderr.write('Created directory ' + imagedir + '\n')
                except OSError:
                    pass
                tikz2image(code, filetype, outfile)
                sys.stderr.write('Created image ' + src + '\n')
            return Para([Image([], [src, ""])])

if __name__ == "__main__":
    toJSONFilter(tikz)

Update我在评论中提到 caps.py 过滤器也因相同的症状而失败。也许我还应该添加以下症状python caps.py temp.md,它正在调用 pandoc 外部的过滤器。我的理解是,这应该将 caps.py 文件全部大写打印到屏幕上。

然而,当我跑步时python caps.py temp.md从 Windows 命令提示符处它挂起。我用以下命令杀死命令CTRL-C,然后我得到以下结果。

C:\Users\Richard\Desktop\temp>python caps.py temp.md
Traceback (most recent call last):
  File "caps.py", line 15, in <module>
    toJSONFilter(caps)

同样的情况发生在python tikz.py temp.md。挂起,然后是:

C:\Users\Richard\Desktop\temp>python tikz.py temp.md
Traceback (most recent call last):
  File "tikz.py", line 70, in <module>
    toJSONFilter(tikz)

Update 2我尝试在命令提示符下运行 Windows 调试器,但我不确定它是否有效。有时命令提示符会挂起。而且调试器似乎也挂起。这是调试器的输出。

*** wait with pending attach
Symbol search path is: *** Invalid ***
****************************************************************************
* Symbol loading may be unreliable without a symbol search path.           *
* Use .symfix to have the debugger choose a symbol path.                   *
* After setting your symbol path, use .reload to refresh symbol locations. *
****************************************************************************
Executable search path is: 
ModLoad: 00007ff7`0d920000 00007ff7`0d97d000   C:\windows\system32\cmd.exe
ModLoad: 00007fff`b7c20000 00007fff`b7dcc000   C:\windows\SYSTEM32\ntdll.dll
ModLoad: 00007fff`b5c90000 00007fff`b5dce000   C:\windows\system32\KERNEL32.DLL
ModLoad: 00007fff`b4e40000 00007fff`b4f55000   C:\windows\system32\KERNELBASE.dll
ModLoad: 00007fff`b7b70000 00007fff`b7c1a000   C:\windows\system32\msvcrt.dll
ModLoad: 00007fff`b3070000 00007fff`b307e000   C:\windows\SYSTEM32\winbrand.dll
(1c7c.29a0): Break instruction exception - code 80000003 (first chance)
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for C:\windows\SYSTEM32\ntdll.dll - 
ntdll!DbgBreakPoint:
00007fff`b7cb2cf0 cc              int     3

Update 3这是 a 中的文件Dropbox 文件夹 https://www.dropbox.com/sh/e6xgwtgfv395phr/AAD69Mse11M5IFXwBymh53Xxa?dl=0。该文件夹包含我上面粘贴的相同文件,加上caps.py文件直接来自 Pandoc 过滤器 github 存储库。


使用 -t 选项后跟格式而不是带有扩展名的文件,例如 pandoc -f json -t markdown 将输出该 markdown,-t html 将输出 html 等以捕获输出使用重定向运算符操作 > file.some_extension 。但你的输出将发送到控制台。所以正确的语法实际上是 pandoc -f json -t markdown。

Also the pandoc documentation http://pandoc.org/README.html. If you run into problems try to modify your lune from:pandoc -o temp.html --filter .\tikz.bat -s temp.md ==> pandoc -t json | ./caps.py latex | pandoc -f json -t html.

这就是它的工作原理。

                 source format = input_file.html
                      ↓
                   (pandoc) = pandoc -t json input_file.html
                      ↓
              JSON-formatted AST 
                      ↓
                   (filter)    = python $HOME/Downloads/pandocfilters-1.2.4/examples/caps.py
                      ↓
              JSON-formatted AST
                      ↓
                   (pandoc)    =  pandoc -f json -t markdown
                      ↓
                target format = output_file.md

分隔命令以检查输出并使用管道 |重定向输出:

 pandoc -t json ~/testing/testing.html | python examples/caps.py | pandoc -f json -t markdown > output_file.md

无需安装 pandocfilters 下载 tar 文件,运行 tar -xvf file.x.y.z 或使用任何其他选择的应用程序,并参考调用 python dir/to/script.py 的示例,然后再次将输出通过管道传输到 pandoc 并将输出重定向到所需的文件格式。这是逐行的:

 $pandoc -t json ~/testing/testing.html
[{"unMeta":{"viewport":{"t":"MetaInlines","c":[{"t":"Str","c":"width=device-width,"},{"t":"Space","c":[]},{"t":"Str","c":"initial-scale=1"}]},"title":{"t":"MetaInlines","c":[]},"description":{"t":"MetaInlines","c":[]}}},[{"t":"Para","c":[{"t":"Str","c":"Hello"},{"t":"Space","c":[]},{"t":"Str","c":"world!"},{"t":"Space","c":[]},{"t":"Str","c":"This"},{"t":"Space","c":[]},{"t":"Str","c":"is"},{"t":"Space","c":[]},{"t":"Str","c":"HTML5"},{"t":"Space","c":[]},{"t":"Str","c":"Boilerplate."}]},{"t":"Para","c":[{"t":"Str","c":"l"}]}]]

then:

$pandoc -t json ~/testing/testing.html | python examples/caps.py 
[{"unMeta": {"description": {"c": [], "t": "MetaInlines"}, "viewport": {"c": [{"c": "WIDTH=DEVICE-WIDTH,", "t": "Str"}, {"c": [], "t": "Space"}, {"c": "INITIAL-SCALE=1", "t": "Str"}], "t": "MetaInlines"}, "title": {"c": [], "t": "MetaInlines"}}}, [{"c": [{"c": "HELLO", "t": "Str"}, {"c": [], "t": "Space"}, {"c": "WORLD!", "t": "Str"}, {"c": [], "t": "Space"}, {"c": "THIS", "t": "Str"}, {"c": [], "t": "Space"}, {"c": "IS", "t": "Str"}, {"c": [], "t": "Space"}, {"c": "HTML5", "t": "Str"}, {"c": [], "t": "Space"}, {"c": "BOILERPLATE.", "t": "Str"}], "t": "Para"}, {"c": [{"c": "L", "t": "Str"}], "t": "Para"}]]

finally:

pandoc -t json ~/testing/testing.html | python examples/caps.py | pandoc -f json -t markdown
HELLO WORLD! THIS IS HTML5 BOILERPLATE.

notes:

diff -y pandoc_json.txt caps_json.txt
[{"unMeta":{"viewport":{"t":"MetaInlines","c":[{"t":"Str","c" / [{"unMeta": {"description": {"c": [], "t": "MetaInlines"}, "v
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Windows 8.1 上使用 Python 过滤器和 Pandoc 将带 tikz 的 md 转换为 html 的相关文章

随机推荐

  • 使用 C++ REST SDK Casablanca 发送 HTTP POST 请求以更新文件内容

    我正在尝试使用 C Rest sdk 更新 alfresco 服务器中的文件内容 我正在使用 alfresco CMIS url 发送请求 更具体地说 它是 Alfresco CMIS 浏览器绑定 我必须坚持浏览器绑定而不是原子绑定 当我发
  • 还记得我的 Cookie 最佳实践吗?

    我读到了许多关于这个论点的老问题 我认为最好的做法是设置一个 cookieusername user id和一个随机令牌 相同 cookie 的数据在 cookie 创建时存储在数据库中 当用户拥有 cookie 时 它 们会进行比较 co
  • 为什么 git 默认执行快进合并?

    来自 Mercurial 我使用分支来组织功能 当然 我也希望在我的历史中看到这个工作流程 我使用 git 开始了我的新项目并完成了我的第一个功能 当合并该功能时 我意识到 git 使用快进 即如果可能的话 它会将我的更改直接应用到主分支
  • hive 添加分区语句忽略前导零

    我在 hdfs 上有文件夹 user test year 2016 month 04 dt 25 000000 0 需要将上面的分区路径添加到test table 命令 ALTER TABLE test ADD IF NOT EXISTS
  • 如何在 ASP.NET Core Razor Pages 中为单页应用程序创建包罗万象的路由?

    对于单页应用程序 我们希望能够将所有未处理的请求路由到索引 以便处理路由客户端 以前 我们将使用 MapRoute 添加路线 详细信息请参见这个答案 https stackoverflow com questions 42414397 as
  • 关注新添加的输入元素

    我有一个新的 Angular 2 应用程序 其中包含以下列表input盒子 当用户按下返回键时 我添加一个新的input紧接着他们当前正在编辑的框后面的框 或者更确切地说 我 异步 向模型中的数组添加一个新条目 这会导致 Angular 2
  • 如何使用 HTML 元素阻止 THREE.js 光线投射?

    我希望页面上的 HTML 元素阻止 THREE js 光线投射 我该如何执行此操作 我遇到的问题是 当用户单击打开的 DIV 元素时 光线投射会检索场景中的对象 它会检索 DIV 后面的对象 我不想在 DIV 打开时禁用光线投射 我纯粹希望
  • 禁用小写字符下划线:g q p j y?

    有时您不希望下划线盲目地穿过带下划线的页面标题 有没有办法自动优雅地禁用强调对于某些小写字符 在这些情况下 最好不要在这些小写字母下划线 例如 g q p j y CSS h1 text decoration underline PAGE
  • 如何在 Windows 上使用 cygwin、git bash 和 vagrant VM 中的 git 设置 git?

    My Setup 我们在工作中使用 Windows 10 我的任务是使用 Vagrant 构建一个我们都想使用的开发虚拟机 我们通过 Vagrant SSH 挂载将 git 文件夹挂载到虚拟机中 目前效果非常好 我们还使用 Visual S
  • 使用 Spring MVC 返回 PDF 文件

    实际上 我有这个功能 我有一个框架 可以在其中设置 URL ip port birt preview report report rptdesign format pdf parameters 并且该框架呈现 PDF 文件 但我想隐藏该网址
  • 如何指定输出可执行文件的名称?

    默认情况下 SPM 会构建与包含其模块文件夹同名 大写 的可执行目标 main swift 如何让它使用不同的文件名构建二进制文件 我找不到任何说明SPM手册 https github com apple swift package man
  • 如何清除 ASP.NET MVC 应用程序中文本框的发布数据?

    默认情况下 使用 呈现的文本框使用发布数据中的值 例如如果页面上存在验证错误 将从发布的数据中检索该值并将其用于 value 属性 现在 在某些情况下 我希望能够清除该值 换句话说 我希望文本框为空 我不希望 MVC 从发布的数据中获取值并
  • 将大型高清视频文件上传到 Amazon Web Services S3

    最终目标 将大型视频文件 内容制作者将是专业用户 因此他们的一点额外工作并不是一个巨大的负担 然而 对他们 和我 来说 保持尽可能简单是理想的 如果可以使用网络表单来启动那就最好了 内容制作者不会有数百个 因此可以投入一些额外的时间或精力为
  • IBM AIX:核心-外壳:显示文件修改日期

    我想用 bash 做这样的事情 查看文件上次修改的时间 ls lha ls full time 但我必须在 AIX 上使用 core shell 怎样才能达到这样的效果呢 您可以使用 istat istat test ksh Inode 8
  • numberOfRowsInSection:重新加载数据时未调用

    我有一个UITableView使用数组来列出数据 这很好用 我也有一个UISearchBar用于搜索那个tableview 当 tableviews 数组中的数据匹配时 这些行将添加到另一个可变数组中 并且cellForRowAtIndex
  • 使用鼠标事件复制拖放时出现问题

    我想用我自己的例程复制标准的 startDrag stopDrag 事件来稍微改变一些事情 并且我遇到了某种事件传播或冒泡问题 这是我的代码
  • 如何使用 jquery 阻止或限制输入字段中的特殊字符?

    如何使用 jquery 阻止在输入字段中输入特殊字符 一个使用正则表达式的简单示例 您可以更改它以允许 禁止您喜欢的任何内容 input on keypress function event var regex new RegExp a z
  • 如何在不破坏默认行为的情况下覆盖 __getattr__ ?

    我如何覆盖 getattr https docs python org 3 reference datamodel html object getattr 类的方法而不破坏默认行为 压倒一切 getattr 应该没事 getattr 仅作为
  • Blob 的簇生长

    考虑以下来自 Mathworks 的图像 我已经用标签标记了斑点 L num bwlabel I 如何迭代连接所有斑点 即从一个斑点开始 找到离它最近的一个 考虑最左边的两个斑点 可以从一个斑点的许多点绘制许多条线来连接到另一个斑点blob
  • 如何在 Windows 8.1 上使用 Python 过滤器和 Pandoc 将带 tikz 的 md 转换为 html

    我正在尝试使用 Pandoc 过滤器将带有 tikz 图片的 markdown 文件转换为 html 我使用的是 Win 8 1 并且我拥有所有依赖项 pdflatex Python 2 7 ImageMagick 和 pandocfilt