我需要检查 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}