如何检查命令是否包含 url

如何检查命令是否包含 url

我需要检查 url 是否是命令的参数。我的第一反应是将参数转换为字符串,然后检查该字符串中是否存在“\url”。这是我目前尝试过的方法。注释行会导致致命错误。

\documentclass{article}
\usepackage{xparse, xstring}
\ExplSyntaxOn
\NewDocumentCommand{ \checkurl }{ m }{
  \token_to_str:N #1 \\
  % \IfSubStr{ \token_to_str:N #1 }{ \textbackslash url }{ url }{ not~an~url } % checks if the string "\url" is in the argument
}
\ExplSyntaxOff
% -----------------
\begin{document}
\checkurl{\url{https://google.com}}
\end{document}

答案1

错误是因为\textbackslash是排版反斜杠的文本命令,而不是“反斜杠字符”。因此它包含字体选择命令和许多其他使字符串比较受阻的东西。无论如何,您都在使用expl3语法,因此您可以替换\textbackslash\c_backslash_str,即“反斜杠字符”。更改此设置后错误就会消失,但输出仍不正确。

\token_to_str:N此外,单身的标记转换为字符串(这是 TeX 的\string原语)。命令的参数不止一个标记(一个标记列表),因此您需要将其替换为\tl_to_str:n(签名也从 更改为 ,N因为n我们需要一个带括号的参数,而不是一个标记)。

最后,你需要确保\IfSubStr能够正常工作:你需要\fullexpandarg在使用之前发出\IfSubStr以确保\tl_to_str:n\c_backslash_str将扩展 xstring尝试比较它们。您还需要使用带星号的变体\IfSubStr,因为否则它将执行令牌比较,您从中获得的令牌\tl_to_str:n { \url }都是 catcode 12 令牌,而从中获得的令牌\c_backslash_str url将是一个 catcode 12 令牌和三个 catcode 11 令牌,匹配将失败。

但是嘿,你已经在使用expl3,那么为什么不直接使用呢\str_if_in:nn?:-)
它将把参数正确转换为 catcode 12 个标记的字符串,并且它是一个很多快点:

\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand { \checkurl } { m }
  {
    \token_to_str:N #1 \\
    \str_if_in:nnTF {#1} { \url }
      { url } { not~an~url }
  }
\ExplSyntaxOff
\begin{document}
\checkurl{\url{https://google.com}}
\end{document}

相关内容