如何比较争论的开始

如何比较争论的开始

我需要用 tex(更准确地说是 ConTeXt,但我认为这并不重要)编写一个简单的函数,当第一个参数 #1 以特定字符串开头时,该函数执行一件事,而当它不是以特定字符串开头时,该函数执行其他事情。例如(伪代码):

\def\somefunction#1{
if (#1.beginsWith"fig:")
  do this
else
  do that
endif
}

如何才能做到这一点:

答案1

虽然纯 TeX 解决方案是可行的,但我提供了一个 Lua 解决方案。您可以使用该函数string.find并使用模式检查参数是否以特定字符串开头^fig:。Lua 函数应包装在 TeX 宏中。下面是一个完整的示例:

\starttexcode
  \define[1]\beginsWith
    {\usercode{beginsWith(\!!bs#1\!!es)}}
\stoptexcode

\startluacode
  userdata = userdata or {}
  userdata.beginsWith = function(arg)
    if string.find(arg, "^fig:") then
      context("starts with “fig:”")
    else
      context("does not start with “fig:”")
    end
  end
\stopluacode

\starttext
  \beginsWith{Some text}\par
  \beginsWith{fig: A figure description}
\stoptext

截屏

答案2

问题指定了 ConTeXt,但留下了一些空白。对于 ConTeXt Mk IV,Lua 解决方案似乎最合理,因为Marco 已回答。对于 Mk II 或其他格式,我们需要 TeX 解决方案。假设 e-TeX 可用,我会选择

\def\beginswith#1{%
  \if\relax\detokenize{#1}\relax
    \expandafter\firstoftwo
  \else
    \expandafter\secondoftwo
  \fi
    {\secondoftwo}%
    {\doifbegins#1fig\blanktest}%
}
\long\def\firstoftwo#1#2{#1}
\long\def\secondoftwo#1#2{#2}
\def\doifbegins#1fig#2\blanktest{%
  \if\relax\detokenize{#1}\relax
    \expandafter\firstoftwo
  \else
    \expandafter\secondoftwo
  \fi
}
\beginswith{fig:stuff}{\TRUE}{\FALSE}
\beginswith{stuff:fig}{\TRUE}{\FALSE}
\beginswith{no}{\TRUE}{\FALSE}
\beginswith{ }{\TRUE}{\FALSE}
\beginswith{}{\TRUE}{\FALSE}
\beginswith{ fig}{\TRUE}{\FALSE}
\csname @@end\endcsname
\end

(如果没有 e-TeX,您需要稍微不同的“空白测试”。)

相关内容