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$
。
参考资料
我只是想问问是否有人知道 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 过滤器的另一种方法,如 *.tex
文件并包含它例如通过 -H
/ --include-in-header
选项到 pandoc
.
基于 Heiko Oberdiek answer to Auto generate list of \url
usages within document 关于 TeX 和 LaTeX StackExchange 的问题:
\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$
。