我想提取第一个字符。对于简单情况,使用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}