xstring 的问题:IfEqCase 案例失败

xstring 的问题:IfEqCase 案例失败

传输我逐个读取字符串中位于 '\' 之前的所有字符。

特里特“翻译”这些字符并输出它们。

最后输出结束字符串的宏。

问题

如果遇到“\”,例如在“xK\星' 或者 'xK3\星', 这 '陣容' 通过了 IfEqCase 测试。这可能是 catcode 问题吗?如何解决?

\documentclass{article}
\usepackage{xstring,ifthen}

\renewcommand{\star}{{}\kern-0.1em\textbf{\large*}}

\def\GetTranslation#1{\textbf{#1}}

\def\Trlt#1{%
  \gdef\Rank{0}%
  \IfInteger{#1}%
  {#1\gdef\Rank{#1}}%
  {%
    \IfEqCase{#1}{%
      {K}{\GetTranslation{K}\gdef\Rank{1}}%
      {x}{x\gdef\Rank{0}}%
    }%[?#1?]% 'K' falls thru if followed by macro, why?
  }%
}% Trlt

\newcounter{ODwCnt}
\verbtocs{\bslash}|\|

\def\Xfer#1{%
  \begingroup%
    \fullexpandarg%
    \scancs[0]\mystring{#1}%
    \StrBefore{\mystring}{\bslash}[\Str]%
    \IfEq{\Str}{}{\def\Str{#1}}{}%
%    \IfEq{\Str}{}{\def\Str{#1}}{!\Str! }% Check \Str
    \setcounter{ODwCnt}{0}%
    \StrLen{\Str}[\Len]%
    \whiledo{\theODwCnt < \Len}{%
      \stepcounter{ODwCnt}%
      \StrChar{\Str}{\theODwCnt}[\OneChar]%
      \Trlt{\OneChar}%
    }%
    \StrBehind{\mystring}{\bslash}[\command]%
    \IfEq{\command}{}{}{%
      \tokenize\myCS{\bslash\command}%
      \myCS%
    }%
  \endgroup%
}% Xfer
\begin{document}

\Xfer{xK3\star}
\Xfer{xK3}

\end{document}
\endinput

答案1

如果您的目标是逐个解析输入标记,那么可以使用一种更简单的方法:

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn

\NewDocumentCommand{\Xfer}{m}
 {
  \tl_map_function:nN { #1 } \jack_translate:n
 }

\cs_new_protected:Nn \jack_translate:n
 {
  \str_case:nnF { #1 }
   {
    {K}{\textbf{K}}
    {x}{\textit{x}}
    {*}{\star}
   }
   { #1 }
 }

\ExplSyntaxOff

\renewcommand{\star}{{}\kern-0.1em\textbf{\large*}}

\begin{document}

\Xfer{xK3\star}

\Xfer{xK3*}

\Xfer{xK3}

\end{document}

在此处输入图片描述

该宏\tl_map_function:nN逐个解析参数标记(但括号组被视为一个单位),并将当前宏传递给第二个宏,该宏可以执行 switch case 工作。

相关内容