V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
tracker647
V2EX  ›  问与答

尝试写个批量把 markdown 转成 pdf 的脚本遇到问题

  •  
  •   tracker647 · 208 天前 · 860 次点击
    这是一个创建于 208 天前的主题,其中的信息可能已经有所发展或是发生改变。

    自己学编程时做了很多笔记,如今累积起来已经有几十个了,有很多图片链,怕哪天图床垮了图片就找不到了,于是就想把当时的 md 文件都转成 pdf ,看了点文章,就开始实践:

    1.下载 pandoc 和 CTex 2.chatGpt 弄一个脚本,需求是扫描脚本所在目录所有的 md 文件,并输出 pdf 文件到指定目录下,pdf 引擎用 xelatex, 转换用的 latex 模版需要和 md 文件目录放在一起,由于我用的 typora ,想让输出的界面效果和 typora 的尽量一致,于是在 typora 官网上找到了个叫eisvogel的模版

    脚本如下:

    import os
    import subprocess
    import sys
    
    
    directory_path = './'
    
    # 确定输出文件夹
    if len(sys.argv) == 2:
        output_folder = sys.argv[1]
    else:
        output_folder = ""
    
    # 确保输出文件夹存在
    if output_folder and not os.path.exists(output_folder):
        os.makedirs(output_folder)
    
    # 获取目录下所有的 md 文件
    md_files = [f for f in os.listdir(directory_path) if f.endswith(".md")]
    
    for md_file in md_files:
        # 构建输出文件路径
        if output_folder:
            output_path = f'{output_folder}/{md_file.replace(".md", ".pdf")}'
        else:
            output_path = f'{md_file.replace(".md", ".pdf")}'
    
        # 构建 pandoc 命令
        cmd = f'pandoc "{md_file}" -o "{output_path}" --pdf-engine=xelatex --template eisvogel.latex --listings -V "CJKmainfont=‘Microsoft YaHei’"'
        print(cmd)
        os.system(cmd)
    
    

    3.执行脚本,结果每个 md 文件都报一堆看不懂的输出然后报错 Package fontspec Error ,但是我检查过系统是有 Microsoft YaHei 这个字体的。

    pandoc "C++ - 多重继承.md" -o "./pdf/C++ - 多重继承.pdf" --pdf-engine=xelatex --listings -V "CJKmainfont=‘Microsoft YaHei’"
    This is METAFONT, Version 2.71828182 (MiKTeX 24.4)
    
    (D:\CTEX\MiKTeX\fonts/source/public/othello\OT.mf
    >> (0,0,line_thickness,0,0,line_thickness)
    ! Transform components aren't all known.
    <to be read again>
                       ;
    set_black_circle->...circle.scaled.line_thickness;
                                                      lft.x1=1/22size;y1=1/2size...
    l.39 set_black_circle
                         ;
    >> 0.04347x2+0.52174
    ! Undefined x coordinate has been replaced by 0.
    <to be read again>
                       ..
    set_black_circle->...size;y2=1/2size;filldraw.z1..
                                                      z2..cycle;black_circle:=cu...
    l.39 set_black_circle
                         ;
    >> 0.47826x2+0.23914
    ! Undefined y coordinate has been replaced by 0.
    <to be read again>
                       ..
    set_black_circle->...size;y2=1/2size;filldraw.z1..
                                                      z2..cycle;black_circle:=cu...
    l.39 set_black_circle
                         ;
    >> x2
    ! Undefined x coordinate has been replaced by 0.
    <to be read again>
                       ..
    set_black_circle->...;y2=1/2size;filldraw.z1..z2..
                                                      cycle;black_circle:=curren...
    l.39 set_black_circle
                         ;
    >> 0.47826x2+0.23914
    ! Undefined y coordinate has been replaced by 0.
    <to be read again>
                       ..
    set_black_circle->...;y2=1/2size;filldraw.z1..z2..
                                                      cycle;black_circle:=curren...
    l.39 set_black_circle
                         ;
    。。。。
    <to be read again>
                       ..
    l.647   draw z5..
                     z6;
    >> -0.5border_line_thickness
    ! Undefined y coordinate has been replaced by 0.
    <to be read again>
                       ;
    l.647   draw z5..z6;
    
    [18] )
    (see the transcript file for additional information)
    Font metrics written on OT.tfm.
    Output written on OT.600gf (19 characters, 504 bytes).
    Transcript written on OT.log.
    
    Sorry, but miktex-maketfm did not succeed.
    
    The log file hopefully contains the information to get MiKTeX going again:
    
      D:\CTEX\UserData\miktex\log\miktex-maketfm.log
    Error producing PDF.
    ! Package fontspec Error: 
    (fontspec)                The font "鈥楳 icrosoft YaHei 鈥?pandoc: <stderr>: hPutChar: invalid argument (Invalid argument)
    

    奇怪的是,把脚本输出的 cmd 字符串直接在 Powershell 上运行就能正常输出,于是我又把脚本改成只输出 cmd 文本,然后 CV 这些文本到 powershell 上批量运行,结果同样也有上述的错误,也就是说,可以单处理,就是不能批处理。

    个人对 latex 的处理方式毫无经验,希望有懂的网友解释一下。

    3 条回复    2024-06-02 15:08:13 +08:00
    yolee599
        1
    yolee599  
       208 天前 via Android
    冷知识:markdown 可以使用本地图片,你把图片下载到本地,图片 URL 路径替换为本地路径就可以了
    Rache1
        2
    Rache1  
       208 天前
    cmd 拼参数对于引号有些特别的问题,改用 subprocess.call 以列表的方式传参试试看。
    YGHMXFAL
        3
    YGHMXFAL  
       208 天前
    ①如楼上所说,拼接产生得 CMD 命令中,[似乎]不能包含单引号

    ②看你最后一行日志,产生了乱码,Python+WIN 组合的典型问题,在 CMD 队列之首插入一行试试:

    CHCP 65001
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1235 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 17:56 · PVG 01:56 · LAX 09:56 · JFK 12:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.