我需要用 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,您需要稍微不同的“空白测试”。)