markdown-package:url 和 hyperref 中的 # 符号问题

markdown-package:url 和 hyperref 中的 # 符号问题

我将 markdown-package 与 pdfLaTeX 结合使用。

\documentclass{article}

\usepackage[    
        blankBeforeBlockquote,
        blankBeforeCodeFence,
        codeSpans,
        citations,
        definitionLists,
        fencedCode,
        hybrid,
        underscores,
        inlineFootnotes,
        hashEnumerators ]{markdown}

\usepackage{hyperref}

\begin{document}
\begin{markdown}

Here's a link to [a website](https://developer.android.com/training/testing/fundamentals.html#testing-pyramid).  

\end{markdown}
\end{document}

如果我编译上述代码,我会收到以下错误消息。

\Hy@tempa 定义中的参数数量非法。

我推测这与宏有关,因为宏参数以# 开头。


我还尝试了编译器提供的以下提示。这对于编译有效,但 pdf 中的链接已损坏...html#%23testin...

您的意思是输入 ## 而不是 #,对吗?或者之前某个地方忘记了 },导致一切都搞砸了?我假设您的意思是 ##。


markdown-package 生成一个 tmp 文件,看起来像这样,也许它有助于回答:

Here's a link to \markdownRendererLink{a website}{https://developer.android.com/training/testing/fundamentals.html#testing-pyramid}{https://developer.android.com/training/testing/fundamentals.html#testing-pyramid}{}.\relax

我对宏了解不是那么深入,所以我不确定是否可以做些什么。

答案1

我认为唯一有效的方法是暂时更改# 的 catcode:

\documentclass{article}

\usepackage[
        blankBeforeBlockquote,
        blankBeforeCodeFence,
        codeSpans,
        citations,
        definitionLists,
        fencedCode,
        hybrid,
        underscores,
        inlineFootnotes,
        hashEnumerators ]{markdown}

\usepackage{hyperref}


\begin{document}
\begin{markdown}

Here's a link to {\catcode`\#=12 [a website](https://developer.android.com/training/testing/fundamentals.html#testing-pyramid).}

\end{markdown}
\end{document}

答案2

正如 Ulrike Fischer 的回答评论部分所讨论的那样,您可以重新定义,以便在使用参数之前\markdownRendererLink更改井号 ( ) 的类别代码。这使逻辑与 markdown 标记分开:#

\documentclass{article}
\usepackage{markdown}
\def\markdownRendererLink{%
  \begingroup
  \catcode`\#=12
  \def\next##1##2##3##4{%
    \markdownRendererLinkPrototype{##1}{##2}{##3}{##4}\endgroup}%
  \next}
\usepackage{hyperref}
\begin{document}
\begin{markdown}
Here's a link to [a website]
(https://developer.android.com/training/testing/fundamentals.html#testing-pyramid).  
\end{markdown}
\end{document}

\markdownRendererLinkPrototype是呈现超链接的默认命令。

答案3

请注意,ifthenelse 包也出现了同样的问题:

\ifthenelse{\isnamedefined{ProcessIntegrationDevice}} {%
  \url{https://sourceforge.net/p/com0com/bugs/32/#c463}

普通乳胶中的解决方案似乎是:

\url{https://sourceforge.net/p/com0com/bugs/32/\#c463}

例如,将“#”替换为“#”。

谢谢大家!Harald

相关内容