Pandoc Filter 为链接添加脚注

Pandoc Filter to add footnotes to links

我只是想问问是否有人知道 Pandoc 的简短过滤器可以自动向任何 link 添加脚注。我只想在我的打印文档中有可读的 link 来源。 所以具体来说,我想从

[link](url)

类似于

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

所以在打印的 PDF 中,我所指的 link 的 URL 应该在页面底部可见。

尝试

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

这只适用于 PDF 输出,但它很简单,不需要过滤器。 在 "Variables for LaTeX."

下查看用户的 Guide/README

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

编辑:这是使用 pandoc filter 的方法,保留 link(未经测试,但应该接近):

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

使用 Pandoc 过滤器的另一种方法,如 中那样,是 使用 LaTeX,创建一个 *.tex 文件并包含它例如通过 -H / --include-in-header 选项到 pandoc.

基于 Heiko Oberdiek answer to Auto generate list of \url usages within document 关于 TeX 和 LaTeX StackExchange 的问题:

,LaTeX 代码可能如下所示(尚未测试)
\let\saved@hyper@linkurl\hyper@linkurl
\renewcommand*{\hyper@linkurl}[2]{%
  \saved@hyper@linkurl{#1}{#2}%
  \footnote{\url{#1}}%
}

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


请注意,上述解决方案中脚注中的 link 使用 \url{<link-target>} 而不是空 <link-target> 作为脚注内容。我认为它看起来更好,而且 URL 中的 _ 肯定没有问题(我不知道 Pandoc 是否为 LaTeX 转义了),并且 [=38= 没有问题] 友好的换行符处理很长 URLs.

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

以下解决方案提供了 OP 所要求的(以及我需要的)无过滤器。无论文档中有 link 的什么地方,它都会保留 link,添加一个脚注,并且在脚注中有一个完整的 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 喜欢 pandoc -V links-as-notes --template=template.latex document.md -o document.pdf。大功告成!

第 3 步(可选)

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

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

参考资料