我的想法是使用xstring
包来处理一些字符串测试。在我的例子中,我使用函数\strLeft
来提取字符串的前 3 个字母。然后,我在\IfStrEqCase
函数中使用这个结果。
\newcommand\textttarg[1]{\expandarg #1\,\, \IfStrEqCase{#1}{{BOV}{bbov}{BOH}{bboh}}[ff]}
\def\nnnnn{\expandarg\StrLeft{BOVComp}{3}}
\nnnnn\\
\textttarg{\nnnnn}
结果很奇怪,因为这个单词是BOVComp
。提取前 3 个字母:BOV
。测试\IfStrEqCase
无法正确看到这 3 个字母并返回默认结果ff
。
这是我的 MWE:
\documentclass[]{article}
\usepackage{tikz}
\usepackage{xstring}
\begin{document}
\newcommand\textttarg[1]{\expandarg #1\,\, \IfStrEqCase{#1}{{BOV}{bbov}{BOH}{bboh}}[ff]}
\def\nnnnn{\expandarg\StrLeft{BOVComp}{3}}
\nnnnn\\
\textttarg{\nnnnn}
\end{document}
答案1
随着\expandarg
第一的的参数中的 token\IfStrEqCase
被扩展一次。
因为你的论点是\nnnnn
,这导致
\IfStrEqCase{\expandarg\StrLeft{BOVComp}{3}}{{BOV}{bbov}{BOH}{bboh}}[ff]
因此,与BOV
或BOH
进行比较的“字符串”\expandarg\StrLeft{BOVComp}{3}
显然不成功。请注意,手册中xstring
提到的“字符串”实际上是指标记,因为 TeX 可以理解这一点。
使用\fullexpandarg
也无济于事,因为\StrLeft
它执行分配,所以不是完全可扩展的。
当然,\nnnnn
单独使用会打印BOV
,因为在这种情况下 TeX 会全程执行必要的任务。
你可能想要
\newcommand{\nnnnn}{BOVComp\StrLeft{BOVComp}{3}[\temp]}
\newcommand{\textttarg}[1]{%
#1
\begingroup\expandarg % localize the effect of \expandarg
\IfStrEqCase{\temp}{{BOV}{bbov}{BOH}{bboh}}[ff]%
\endgroup
}
完整示例:
\documentclass{article}
\usepackage{xstring}
\newcommand{\nnnnn}{BOVComp}
\newcommand{\textttarg}[1]{%
#1
\begingroup\expandarg % localize the effect of \expandarg
\StrLeft{#1}{3}[\temp]%
\IfStrEqCase{\temp}{{BOV}{bbov}{BOH}{bboh}}[ff]%
\endgroup
}
\begin{document}
\textttarg{\nnnnn}
\textttarg{BOHComp}
\end{document}
以下是我的做法expl3
:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\textttarg}{m}
{
#1~
\str_case_x:nnF { \__guuk_get_three:o { #1 } }
{
{BOV}{bbov}
{BOH}{bboh}
}
{ff}
}
\cs_new:Npn \__guuk_get_three:n #1
{
\__guuk_get_three:w #1 . . . \q_stop
}
\cs_generate_variant:Nn \__guuk_get_three:n { o }
\cs_new:Npn \__guuk_get_three:w #1 #2 #3 #4 \q_stop
{
#1#2#3
}
\ExplSyntaxOff
\newcommand{\nnnnn}{BOVComp}
\begin{document}
\textttarg{\nnnnn}
\textttarg{BOHComp}
\textttarg{Uh}
\end{document}