【问题标题】:Pandoc Filter to add footnotes to linksPandoc 过滤器为链接添加脚注
【发布时间】:2017-02-27 04:58:22
【问题描述】:

我只是想问一下是否有人知道 Pandoc 的简短过滤器,可以自动为任何链接添加脚注。我只想在我的打印文档中有可读的链接源。 所以要指定,我想从

[link](url)

类似

[link](url)[^link: url] 

因此,在打印的 PDF 中,我所指的链接的 URL 应该在页面底部可见。

【问题讨论】:

    标签: markdown pandoc


    【解决方案1】:

    试试

    pandoc -o myfile.pdf -V links-as-notes=true myfile.md
    

    这仅适用于 PDF 输出,但它很简单并且不需要过滤器。 请参阅“LaTeX 的变量”下的用户指南/README。

    编辑:使用这种方法,正文中不再有超链接,只是带有 URL 的注释。所以这并不完全符合您的要求,但也许已经足够了。

    编辑:以下是使用pandoc filter 的方法,保留链接(未经测试,但应该关闭):

    import Text.Pandoc.JSON
    
    main = toJSONFilter go
      where go (Link attr lab (src, tit)) = Span ("",[],[]) [Link attr lab (src, tit), Note [Plain [Str src]]]
            go x = x
    

    【讨论】:

    • 谢谢,没想到这么简单。我也希望链接仍然存在,但你不能拥有一切:)
    • 您的第二次编辑似乎不起作用,第一个链接只是一遍又一遍地重复:imgur
    • 我编辑并使用了不同的方法 - 再次未经测试(我远离可以测试的环境)。
    • 请注意,在新的pandoc中,Link元素的定义发生了变化,因此您需要将Link lab (src, tit)替换为Link attr lab (src, tit),它可以工作。
    【解决方案2】:

    使用 Pandoc 过滤器的替代方法,如 John MacFarlane answer 将是为此使用 LaTeX,创建一个 *.tex 文件并包括它,例如通过 -H / @987654326 @ 选项为pandoc

    基于 TeX 和 LaTeX StackExchange 上的 Heiko Oberdiek answerAuto generate list of \url usages within document 问题,LaTeX 代码可能看起来像这样(尚未测试):

    \let\saved@hyper@linkurl\hyper@linkurl
    \renewcommand*{\hyper@linkurl}[2]{%
      \saved@hyper@linkurl{#1}{#2}%
      \footnote{\url{#1}}%
    }
    

    我认为url 包是由 Pandoc 自动包含的;如果没有,您需要在上面的代码顶部添加\usepackage{url}


    请注意,上述解决方案中脚注中的链接使用\url{<link-target>} 而不是裸露的<link-target> 作为脚注内容。我认为它看起来更好,并且 URL 中的_ 肯定不会有问题(我不知道 Pandoc 是否会为 LaTeX 转义),并且对于非常长的 URL 的 URL 友好的换行处理没有问题.

    John MacFarlane 的答案可以很简单地修改为:

    import Text.Pandoc.JSON
    
    main = toJSONFilter go
      where go (Link alt desc (url, title)) = Span ("",[],[]) [Link alt desc (url, title), Note [Plain [Link alt [Str url] (url, "")]]]
            go x = x
    

    【讨论】:

      【解决方案3】:

      以下解决方案通过无过滤器提供了 OP 所要求的(以及我需要的)。无论您在文档中的何处有链接,它都会保留该链接,添加一个脚注,并且在脚注中有一个完整的 URL。

      不过,此解决方案确实需要您修改 LaTeX 模板。

      第 1 步(可选,如果您已有自定义 LaTeX 模板)

      如果您还没有在某处复制默认模板,现在使用pandoc -D latex 执行此操作,并将该输出保存到一个文件中,也许是template.latex,我将使用它作为其余部分的示例名称。

      第 2 步

      找到您的模板的以下部分(默认模板中为present):

      $if(links-as-notes)$
      % Make links footnotes instead of hotlinks:
      \renewcommand{\href}[2]{#2\footnote{\url{#1}}}
      $endif$
      

      替换成

      $if(links-as-notes)$
      \usepackage{letltxmacro}
      % Alias href to originalHref to avoid an infinite loop
      \LetLtxMacro{\originalHref}{\href}
      % Make links footnotes in addition to hotlinks:
      \renewcommand{\href}[2]{\originalHref{#1}{#2}\footnote{\url{#1}}}
      $endif$
      

      然后像pandoc -V links-as-notes --template=template.latex document.md -o document.pdf 一样运行pandoc。大功告成!

      第 3 步(可选)

      您可以进行一些调整。如果你写腻了-V links-as-notes,你可以:

      • links-as-notes: true 添加到文档的YAML metadata,或
      • 只需从模板中删除$if(links-as-notes)$ 和对应的$endif$

      参考文献

      【讨论】:

        猜你喜欢
        • 2019-01-04
        • 1970-01-01
        • 2022-01-14
        • 1970-01-01
        • 1970-01-01
        • 2023-03-16
        • 2017-05-27
        • 2017-02-10
        • 1970-01-01
        相关资源
        最近更新 更多