我有一个命令定义为
\newcommand{\testspace}[1]{\str_if_eq:nnTF{~}{#1}{yes}{no}}
现在\testspace{ }
是肯定的,也是\testspace{s}
否定的。然而,
\testspace{\str_item:nn{s }{2}} %->no
这该如何解释?如何让它输出“是”?
答案1
您没有提供示例代码,但是
\testspace{\str_item:nn{s }{2}} %->no
如果你处于 expl3 区域,空间会被忽略,因此
\testspace{\str_item:nn{s}{2}} %->no
如果你在文档中
\testspace{\str_item:nn{s }{2}} %->no
\str
将给出一个未定义的错误,随后出现缺失$
错误,因为_
必须在数学模式下
\documentclass{article}
\ExplSyntaxOn
\cs_generate_variant:Nn\str_if_eq:nnTF{neTF}
\newcommand{\testspace}[1]{\str_if_eq:neTF{~}{#1}{yes}{no}}
\ExplSyntaxOff
\begin{document}
Now \testspace{ } is yes and \testspace{s} is no. However,
\ExplSyntaxOn
\testspace{\str_item:nn{s ~ }{2}} %->no
\ExplSyntaxOff
\end{document}
答案2
这取决于你在哪里。
如果\ExplSyntaxOn
有效,则不\str_item:nn{s }{2}
返回任何内容,因为空格会被忽略。另一方面,\str_item:nn{s~}{2}
将返回一个空格标记。
如果希望测试在“用户空间”可用,请定义如下:
\documentclass{article}
\ExplSyntaxOn
\NewExpandableDocumentCommand{\testspaceTF}{ommm}
{
\IfNoValueTF{#1}
{% no optional argument, test the whole string
\str_if_eq:nnTF { #2 } { ~ } { #3 } { #4 }
}
{% optional argument to test a single item in the string
\exp_args:Ne \str_if_eq:nnTF { \str_item:nn { #2 } { #1 } } { ~ } { #3 } { #4 }
}
}
\ExplSyntaxOff
\begin{document}
\testspaceTF{s}{yes}{no} (should print no)
\testspaceTF{ }{yes}{no} (should print yes)
\testspaceTF[2]{s }{yes}{no} (should print yes)
\testspaceTF[1]{s }{yes}{no} (should print no)
% check expandability
\edef\test{\testspaceTF[2]{s }{yes}{no}}
\texttt{\meaning\test}
\end{document}
答案3
如果你愿意并且能够用 LuaLaTeX 编译你的文档,你可以使用 Lua 的字符串查找函数来测试字符串中是否存在空格。
% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{luacode} % for \luaexec and \luastring macros
\newcommand\testspace[1]{\luaexec{%
if string.find ( \luastring{#1} , "\%s" ) then tex.sprint ( "yes" )
else tex.sprint ( "no" ) end }}
\newcommand\foo{s }
\begin{document}
\testspace{ } \testspace{s} \testspace{s } \testspace{\foo}
\end{document}