我希望 Markdown 包将 markdown 自动链接渲染<some-url>
为 LaTeX \url{some-url}
,因此我添加了一个自定义的简单链接渲染器。以下是显示所有情况的 MWE:
\documentclass[a5paper]{article}
\usepackage{xurl}
\usepackage[smartEllipses,inlineFootnotes,hybrid]{markdown}
\begin{document}
\begin{markdown}
#### Standard URL/link management
1. https://ctan.mirror.garr.it/mirrors/ctan/macros/generic/markdown/markdown.pdf
2. <https://ctan.mirror.garr.it/mirrors/ctan/macros/generic/markdown/markdown.pdf>
3. [link-label](https://ctan.mirror.garr.it/mirrors/ctan/macros/generic/markdown/markdown.pdf)
4. [](https://ctan.mirror.garr.it/mirrors/ctan/macros/generic/markdown/markdown.pdf)
5. \url{https://ctan.mirror.garr.it/mirrors/ctan/macros/generic/markdown/markdown.pdf}
I'd like case 2 to behave like case 5.
\end{markdown}
\markdownSetup{ renderers = {link = {\url{#2}}} } % this should stay in preamble
\begin{markdown}
#### Custom URL/link management
Previous cases 2 and 4 behave (as wanted) like case 5, but case 3 behavior is lost:
1. https://ctan.mirror.garr.it/mirrors/ctan/macros/generic/markdown/markdown.pdf
2. <https://ctan.mirror.garr.it/mirrors/ctan/macros/generic/markdown/markdown.pdf>
3. [link-label](https://ctan.mirror.garr.it/mirrors/ctan/macros/generic/markdown/markdown.pdf)
4. [](https://ctan.mirror.garr.it/mirrors/ctan/macros/generic/markdown/markdown.pdf)
5. \url{https://ctan.mirror.garr.it/mirrors/ctan/macros/generic/markdown/markdown.pdf}
\end{markdown}
\end{document}
交付
不幸的是,使用这样的自定义渲染器,我失去了 markdown 的标准渲染[some-label](some-url)
。
是否可以定义一个自定义链接渲染器,仅能够改变情况 2 的行为?
注意:我使用 XeLaTeX 进行编译。
跟进
提示https://github.com/Witiko/markdown/issues/79#issuecomment-852223526让您避免根据您的 URL 内容可能遇到的一些特殊字符问题。
答案1
用户手册链接渲染器定义如下:
2.3.1.7 链接渲染器
该
\markdownRendererLink
宏表示一个超链接。它接收四个参数:标签、可直接排版的完全转义 URI、可在排版之外使用的原始 URI 以及链接的标题。
从这个定义来看,不清楚如何区分标记链接 ( [label](https://foo.bar/ "title")
) 和自动链接 ( <https://foo.bar/>
, )。然而,Lua 解析器实际上可以很容易地区分它们:<[email protected]>
- 对于自动链接 URI,标签 (
#1
) 和完全转义 URI (#2
) 是等效的。 - 对于自动链接电子邮件,带有
mailto:
前缀的标签 (mailto:#1
) 和完全转义的 URI (#2
) 是等效的。
有了这些知识,您可以为标记链接、自动链接电子邮件和自动链接 URI 定义不同的渲染:
\markdownSetup{
renderers = {
link = {%
\ifthenelse{\equal{#1}{#2}}{%
% Handle autolink URI. <https://foo.bar/>
}{%
\ifthenelse{\equal{mailto:#1}{#2}}{%
% Handle autolink e-mail. <[email protected]>
}{%
% Handle labeled link. [label](https://foo.bar/ "title")
}%
}%
}
}
}
编辑: 自 Markdown 2.14.0 起,该relativeReferences
选项允许您输入相对引用并将它们视为链接:
I conclude in Section <#conclusion>.
Conclusion {#conclusion .some-snippet}
==========
In this paper, we have discovered that most grandmas would rather eat
dinner with their grandchildren than get eaten. Begone, wolf!
您可以通过测试 URL 的第一个字符是否为 来检测这种特定情况#
,尽管其他相对引用(?key=value
或./some/file.tex
)也是可能的。
\usepackage{expl#}
\ExplSyntaxOn
\def\markdownRendererLinkPrototype{
\begingroup
\catcode`\#=12 % Make hash sign (#) into an other character.
\def\next##1##2##3##4{
\endgroup
\tl_set:Nx
\l_tmpa_tl
{ \str_range:nnn { ##3 } { 1 } { 1 } }
\str_if_eq:NNTF
\l_tmpa_tl
\c_hash_str
{
% Handle identifier \str_range:nnn { ##3 } { 2 } { -1 }
% following a hash sign.
}{
% Handle others types of links.
}
}
\next
}
\ExplSyntaxOff
答案2
以下代码可供我使用:
\def\markdownRendererLink#1#2#3#4{\href{#3}{#1}{}{}}
例如 markdown[StackExchange](stackexchange.com)
生成 latex\href{stackexchange.com}{StackExchange}