Latex 3将宏参数拆分为字符串

Latex 3将宏参数拆分为字符串

我尝试使用 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。在这种情况下,弹出是不必要的,因为您可以通过数字访问该项目;但是,根据您的目标,这可能是必要的。

相关内容