提取第一个字符(允许额外分组)

提取第一个字符(允许额外分组)

我想提取第一个字符。对于简单情况,使用xstring's\StrChar就没问题。但是,当参数有额外的括号组时,我需要一些扩展魔法才能使其工作。

我天真的尝试 1) 测试第一个字符和\IfBeginWith{#1}{\{}{}{}2) 使用\fullexpandarg并没有解决这个问题。

下面的 MWE 产生

在此处输入图片描述

而所需的输出是a针对两种情况的。

相关问题:

代码:

\documentclass{article}
\usepackage{xstring}

\newcommand*{\ExtractFirstChar}[1]{%
    %% #1 = string to extract first char from
    %\fullexpandarg
    %\IfBeginWith{#1}{\{}{%
    %    \StrChar{#1}{2}[\FirstChar]%
    %}{%
        \StrChar{#1}{1}[\FirstChar]%
    %}%
    First char of '#1' is '\FirstChar'\par
}

\begin{document}
  \ExtractFirstChar{abc}
  \ExtractFirstChar{{a,b,c}}
\end{document}

答案1

您应该使用\StrRemoveBraces之前\StrChar

\newcommand*{\ExtractFirstChar}[1]{%
    \StrRemoveBraces{#1}[\FirstChar]%
    \StrChar{\FirstChar}{1}[\FirstChar]%
    First char of '#1' is '\FirstChar'\par
}

答案2

假设您的输入仅包含(非 TeX 特殊) ASCII 字符和括号:

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewExpandableDocumentCommand{\firstchar}{sm}
 {
  \IfBooleanTF{#1}
   {
    \grill_firstchar:V #2
   }
   {
    \grill_firstchar:n { #2 }
   }
 }

\cs_new:Nn \grill_firstchar:n
 {
  \int_compare:nTF { \tl_count_tokens:f { \tl_head:n { #1 } } > 1 }
   {% we have to redo
    \grill_firstchar:f { \tl_head:n { #1 } }
   }
   {% just one token
    \tl_head:n { #1 }
   }
 }
\cs_generate_variant:Nn \tl_count_tokens:n { f }
\cs_generate_variant:Nn \grill_firstchar:n { V, f }

\ExplSyntaxOff

\begin{document}

\firstchar{abc} should print ``a''

\firstchar{{a,b,c}} should print ``a''

\firstchar{{{a},b,c}} should print ``a''

\newcommand\test{{{a}},b,c}

\edef\result{\firstchar*{\test}} \result\ should print ``a''

\end{document}

在此处输入图片描述

相关内容