我尝试使用 expl3 包将宏参数拆分为两个单独的字符串,使用“下划线”字符,但以下所有尝试(注释行)均无效。我还尝试了 xparse NewDocumentCommands 的“verbatim”参数说明符
\documentclass{article}
\usepackage{xstring}
\usepackage{xparse}
\usepackage{expl3}
\ExplSyntaxOn
\NewDocumentCommand{\smartVec}{m}{
\seq_clear_new:N \vseq_input
\seq_set_split:Nnn \vseq_input {\_}{#1}
% \seq_set_split:Nnn \vseq_input {\textunderscore}{#1}
% \seq_set_split:Nnn \vseq_input {_}{#1}
% \seq_set_split:Nnn \vseq_input {\mathunderscore}{#1}
% \seq_set_split:Nnn \vseq_input {\char`_}{#1}
\seq_item:Nn \vseq_input {1}
}
\ExplSyntaxOff
我也试过
\ExplSyntaxOff
\NewDocumentCommand{\smartVec}{m}{
\str_clear_new:N \vstr_input
\str_set:Nn \vstr_input {#1}
\seq_clear_new:N \vseq_input
\seq_set_split:Nnn \vseq_input {\_}{\vstr_input}
\str_clear_new:N \vstr_test
\seq_pop_left:NN \vseq_input \vstr_test
\str_use:N \vstr_test
}
\ExplSyntaxOff
\begin{document}
$\smartVec{a_b}$
\end{document}
运行这个宏的预期结果应该是(至少我希望是)$a$,但它显示$a_b$
笔记:如果可能的话,我更愿意得到关于如何使我的宏工作的答案,而不是建议不同的解决方案(使用另一个包,纯 tex 等),因为我计划基于 expl3 包的工具向这个宏添加更多东西。
笔记:在写这个问题之前,我已经将 texlive-full 更新到 2017 版本,但没有任何变化。
笔记:我还尝试查找字符串是否包含下划线字符,但也失败了。(看起来 expl3 无法解释我尝试使用的五个下划线字符中的任何一个)
编辑:我也尝试过使用 split\seq_set_split:Nnn \sequence {\c_math_subscript_token}{#1}
但没有结果
答案1
下划线具有特殊状态\ExplSyntaxOn
(它被视为字母,以便成为命令名称的一部分),因此它与“用户空间”中的下划线不匹配。
\documentclass{article}
\usepackage{expl3}
\usepackage{xstring}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\smartVec}{ m }
{
\kamanji_svec_split:Nn \l_kamanji_svec_input_seq { #1 }
\seq_item:Nn \l_kamanji_svec_input_seq { 1 }
}
\seq_new:N \l_kamanji_svec_input_seq
\cs_new:Nn \kamanji_svec_split:Nn
{
\seq_set_split:Nxn #1 { \char_generate:nn { `_ } { 8 } } { #2 }
}
\cs_generate_variant:Nn \seq_set_split:Nnn { Nx }
\ExplSyntaxOff
\begin{document}
$\smartVec{a_b}$
\end{document}
我定义了一个辅助函数只是为了避免在主代码中进行复杂的输入。
这仅打印“a”。
请遵守函数和变量命名准则。请注意,str
在处理诸如 之类的事情时, 是错误的数据类型\seq_pop_left:NN
。在这种情况下,弹出是不必要的,因为您可以通过数字访问该项目;但是,根据您的目标,这可能是必要的。