代码之家  ›  专栏  ›  技术社区  ›  Kensmosis

是否有方法在pandoc标题元数据中包含乳胶符号(例如-M标题“$x\rightarrow y$”)?

  •  0
  • Kensmosis  · 技术社区  · 6 月前

    我想运行以下表单的命令

    'pandoc foo.md -o foo.tex -M title='Some Notes on $x^{y^z}\pi$' --template=mytemplate.pandoc

    哪里 mytemplate.pandoc 使用 $title$ 要打印标题,请将标题放在每个页眉中等。

    因为我从同一个模板和Makefile构建了许多笔记集,所以我想在CLI上指定标题,如上所述。我的实际通话也有其他标志,但这些都不相关。

    问题是我无法让pandoc传递乳胶代码。即使我正确地转义文本以在Makefile中使用,这也是正确的。如果我写 echo '$$x^{y^z}\pi$$' echo '\[x^{y^z}\pi\]' 在我的Makefile中,我生成 $x^{y^z}\pi$ \[x^{y^z}\pi\] 正如预期的那样,所以我肯定会将所需的代码传递给pandoc。

    然而,pandoc将这些转化为 \$x\^{}\{y\^{}z\}\textbackslash\textbackslash pi\$ \textbackslash{[}x\^{}\{y\^{}z\}\textbackslash\textbackslash pi\textbackslash{]} ,这可以防止在我将文件编译为pdf时呈现乳胶代码。

    我无法找到任何方法来安抚Makefile和让pandoc在不将其转换为文本的情况下通过乳胶代码。

    有什么方法可以管理这个吗?或者我必须为每组笔记从python自动生成一个模板吗(这有点违背了模板的意义)。

    提前感谢您的帮助!

    干杯, 肯

    应评论者的要求,这里有一个最小的可重复示例:

    文件foo.md:

    Blah Blah Blah
    

    文件foo.pandoc:

    \documentclass{article}
    \usepackage{amsmath}
    \title{$title$}
    \begin{document}
    
    \maketitle
    
    $body$
    
    \end{document}
    

    文件生成文件:

    main: ./foo1.tex ./foo2.tex
    
    ./foo1.tex: ./foo.md
            pandoc $< -o $@ -M title='Some Notes on the \[x^{y^z}\pi\]' --template=foo.pandoc
            echo '\[x^{y^z}\pi\]'
    
    ./foo2.tex: ./foo.md
            pandoc $< -o $@ -M title='Some Notes on the $$x^{y^z}\pi$$' --template=foo.pandoc
            echo '$$x^{y^z}\pi$$'
    
    0 回复  |  直到 6 月前
        1
  •  3
  •   tarleb    6 月前

    Pandoc将元数据值解释为未格式化的字符串,并将输出以输出格式生成字符串的代码。因此,所有的逃跑。

    有两种方法可以解决这个问题:要么说服pandoc接受输入作为 格式化 string,或者告诉pandoc插入字符串 逐字逐句 .

    后者更容易,只需更换 --metadata / -M 具有 --variable / -V .Pandoc将按原样使用变量,并将其插入模板中。缺点是这需要特定格式的输入,因此在这种特定情况下,它不适用于LaTeX以外的输出格式。

    pandoc --variable='title:Some Notes on $x^{y^z}\pi$' …
    

    另一种方法是让pandoc相信元数据是格式化的。再一次,有两种方法可以做到这一点。

    1. 使用元数据文件。这是一个YAML文件,其中的字符串标量将被解析为Markdown。所以你可以这样做:

      my_metadata=$(mktemp 'metadata-yaml.XXX')
      echo 'title: Some Notes on $x^{y^z}\pi$' > ${my_metadata}
      pandoc --metadata-file=${my_metadata} …
      rm ${my_metadata}
      
    2. 使用Lua过滤器解析元数据字符串。为此,你需要一个Lua脚本,例如。, parse-metadata.lua ,内容

      function Meta (meta)
        for key, value in pairs(meta) do
          if type(value) == 'string' then
            meta[key] = pandoc.utils.blocks_to_inlines(
              pandoc.read(value).blocks)
          end
        end
        return meta
      end
      

      通过以下方式将此脚本传递给pandoc --lua-filter / -L 并继续使用 --元数据 / M 像以前一样。元数据现在将被解析为Markdown。

      pandoc --lua-filter=parse-markdown.lua -M 'title:Some Notes on $x^{y^z}\pi$'