![markdown-package:url 和 hyperref 中的 # 符号问题](https://linux22.com/image/371709/markdown-package%EF%BC%9Aurl%20%E5%92%8C%20hyperref%20%E4%B8%AD%E7%9A%84%20%23%20%E7%AC%A6%E5%8F%B7%E9%97%AE%E9%A2%98.png)
我将 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