![在命令中使用变量会导致 ! \reserved@a 的参数有一个额外的 }](https://linux22.com/image/268621/%E5%9C%A8%E5%91%BD%E4%BB%A4%E4%B8%AD%E4%BD%BF%E7%94%A8%E5%8F%98%E9%87%8F%E4%BC%9A%E5%AF%BC%E8%87%B4%20!%20%5Creserved%40a%20%E7%9A%84%E5%8F%82%E6%95%B0%E6%9C%89%E4%B8%80%E4%B8%AA%E9%A2%9D%E5%A4%96%E7%9A%84%20%7D.png)
我想定义一个命令,它分隔一个字符串,然后\href
向第一部分添加一个不同于第二部分的 (例如\qname{foaf:Person}
)。但我拥有的代码不起作用,! Argument of \reserved@a has an extra }.
当我尝试运行它时,我得到了 。
\RequirePackage{xstring}
\RequirePackage{hyperref}
\RequirePackage{url}
\newcommand{\prefix}{}%
\newcommand{\postfix}{}%
\newcommand{\qname}[1]{%
\IfSubStr{#1}{:}{%
\renewcommand{\prefix}{\StrBefore{#1}{:}}%
\renewcommand{\postfix}{\StrBehind{#1}{:}}%
\nolinkurl{\prefix}:\nolinkurl{\postfix}
}{%
\url{#1}%
}%
}
如果我只是输出\prefix
而不是\nolinkurl{\prefix}:\nolinkurl{\postfix}
它可以工作,但我想将它作为 url。
我认为变量处理有问题,但我找不到有关此信息。
答案1
请始终发布完整的文档而不仅仅是片段。
如果你添加
\show\prefix
:
你会发现它并不完全是之前的字符
> \prefix=\long macro:
->\StrBefore {a:b}{:}.
这大概不会扩展为 hyperref 喜欢的东西。
此版本仅使用可扩展宏来分割:
\documentclass{article}
\RequirePackage{xstring}
\RequirePackage{hyperref}
\RequirePackage{url}
\newcommand{\prefix}{}%
\newcommand{\postfix}{}%
\newcommand{\qname}[1]{%
\IfSubStr{#1}{:}{%
\renewcommand{\prefix}{\StrBefore{#1}{:}}%
\renewcommand{\postfix}{\StrBehind{#1}{:}}%
\show\prefix
\nolinkurl{\prefix}:\nolinkurl{\postfix}
}{%
\url{#1}%
}%
}
\def\qname#1{\xqname#1:\valign:\\}
\def\xqname#1:#2:#3\\{%
\nolinkurl{#1}%
\ifx\valign#2%
\else
:\nolinkurl{#2}%
\fi}
\begin{document}
\qname{aaa}
\qname{a:b}
\end{document}
答案2
目前尚不清楚为什么要在冒号处分裂;但这是解决问题的另一种方法。
\documentclass{article}
\usepackage{xparse,l3regex}
\usepackage{hyperref}
\ExplSyntaxOn
\tl_new:N \l_gecko_prefix_tl
\tl_new:N \l_gecko_postfix_tl
\NewDocumentCommand{\qname}{m}
{
\regex_match:nnTF { \: } { #1 }
{
\tl_set:Nn \l_gecko_prefix_tl { #1 }
\tl_set:Nn \l_gecko_postfix_tl { #1 }
\regex_replace_once:nnN { \A (.*) \: (.*) \Z } { \1 } \l_gecko_prefix_tl
\regex_replace_once:nnN { \A (.*) \: (.*) \Z } { \2 } \l_gecko_postfix_tl
\nolinkurl{ \l_gecko_prefix_tl } : \nolinkurl{ \l_gecko_postfix_tl }
}
{\url{#1}}
}\ExplSyntaxOff
\begin{document}
\qname{foo:bar}
\qname{http://tex.stackexchange.com}
\qname{127.0.0.1}
\end{document}
答案3
不确定这是否解决了您的问题。它使用stringstrings
包来解析字符串。
\documentclass{article}
\RequirePackage{stringstrings}
\usepackage{ifthen}
\RequirePackage{hyperref}
\RequirePackage{url}
\newcommand{\prefix}{}%
\newcommand{\postfix}{}%
\newcounter{index}
\newcommand{\qname}[1]{%
\whereischar[q]{#1}{:}%
\setcounter{index}{\theresult}%
\ifthenelse{\value{index} = 0}%
{\url{#1}}%
{%
\addtocounter{index}{-1}%
\substring[q]{#1}{1}{\value{index}}%
\edef\prefix{\thestring}%
\addtocounter{index}{2}%
\substring[q]{#1}{\value{index}}{$}%
\edef\postfix{\thestring}%
\nolinkurl{\prefix}:\nolinkurl{\postfix}
}%
}
\begin{document}
\qname{aaa}
\qname{a:b}
\qname{http://tex.stackexchange.com}
\end{document}