检查字符串的某项是否为空格

检查字符串的某项是否为空格

我有一个命令定义为

\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}

相关内容