在命令中使用变量会导致 ! \reserved@a 的参数有一个额外的 }

在命令中使用变量会导致 ! \reserved@a 的参数有一个额外的 }

我想定义一个命令,它分隔一个字符串,然后\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}

在此处输入图片描述

相关内容