使用 Markdown 包渲染自动链接

使用 Markdown 包渲染自动链接

我希望 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}

相关内容