xstring 的嵌套或变量函数

xstring 的嵌套或变量函数

我的想法是使用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]

因此,与BOVBOH进行比较的“字符串”\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}

在此处输入图片描述

相关内容