在传输我逐个读取字符串中位于 '\' 之前的所有字符。
特里特“翻译”这些字符并输出它们。
最后输出结束字符串的宏。
问题
如果遇到“\”,例如在“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 工作。