如何将 URL 的内容传递给宏而不会因 URL 中的某些字符而出现错误?

如何将 URL 的内容传递给宏而不会因 URL 中的某些字符而出现错误?

我有一个宏,可以在表中添加一个条目。第一个条目是 URL。

这对大多数 URL 都有效,除了一些带有奇怪字符的 URL。

我想使用一个宏,因为我想在宏内部根据某些条件对其进行自定义。

现在我在宏本身中有了\url命令。而不是在调用方端。有没有办法传递 URL 而不出现错误,还是我必须更改所有代码以\url在调用方端添加?

这是 MWE

\documentclass[12pt]{article}
\usepackage{hyperref}

\newcommand{\addEntry}[3]
{%
    \expandafter\url\expandafter{\detokenize{#1}}%
    &#2
    &#3
   \\\hline
}%

\begin{document}

\begin{tabular}[c]{|p{2in}|p{2in}|p{1in}|}\hline 
Link&description&date added\\\hline 
\addEntry{https://www.maplesoft.com/support/help/maple/view.aspx?path=odeadvisor%2FAbel}{Maple entry for Abel first kind}{August 2022}
\end{tabular}

\end{document}

上面的代码报错,因为 url 中有?%?错误是

lualatex foo.tex

(/usr/local/texlive/2022/texmf-dist/tex/latex/l3backend/l3backend-luatex.def)
(./foo.aux) (/usr/local/texlive/2022/texmf-dist/tex/latex/base/ts1cmr.fd)
(./foo.out) (./foo.out))
Runaway argument?
{https://www.maplesoft.com/support/help/maple/view.aspx?path=odeadvis\ETC.
! File ended while scanning use of \addEntry.
<inserted text> 
\par 
<*> foo.tex
        
? 

我知道我可以不使用宏,而是在表格本身中对所有内容进行硬编码,就像这样

\begin{tabular}[c]{|p{2in}|p{2in}|p{1in}|}\hline 
Link&description&date added\\\hline 
\url{https://www.maplesoft.com/support/help/maple/view.aspx?path=odeadvisor%2FAbel}&Maple entry for Abel first kind&August 2022
\end{tabular}

上述方法可行。但是如何使用宏来实现呢?我尝试将其放在\url调用方一侧,但没有成功。我这样做了

\documentclass[12pt]{article}
\usepackage{hyperref}

\newcommand{\addEntry}[3]
{%
    #1
    &#2
    &#3
   \\\hline
}%

\begin{document}

\begin{tabular}[c]{|p{2in}|p{2in}|p{1in}|}\hline 
Link&description&date added\\\hline 
\addEntry{\url{https://www.maplesoft.com/support/help/maple/view.aspx?path=odeadvisor%2FAbel}}{Maple entry for Abel first kind}{August 2022}
\end{tabular}

\end{document}

仍然出现同样的错误。

如何正确地将此 URL 传递给宏?

ps. 我不想编辑 URL 并转义任何奇怪的字符,这就是为什么我使用\url\href

Linux 上的 TL 2022。

答案1

您需要逐字读取 URL 参数。这可以使用\NewDocumentCommand{}{}{}from 来完成解析

在此处输入图片描述

\documentclass[12pt]{article}
\usepackage{geometry}
\usepackage[colorlinks]{hyperref}

\NewDocumentCommand{\addEntry}{vmm}{%
    \url{#1} & #2 & #3 \\ \hline}

\begin{document}

\begin{tabular}{|p{2in}|p{2in}|p{1in}|}
    \hline 
    Link & description & date added \\
    \hline 
    \addEntry{https://www.maplesoft.com/support/help/maple/view.aspx?path=odeadvisor%2FAbel}%
        {Maple entry for Abel first kind}%
        {August 2022}
\end{tabular}

\end{document}

相关内容