访问参数列表中的一个元素

访问参数列表中的一个元素

如何访问作为参数传入的以正斜杠分隔的列表中的一个元素?

\def\MacroTestOne#1{
    %How do I just pass 2 in here?
}


\def\MacroTestTwo#1{
    \MacroTestOne{#1b}
}

\documentclass{article}

\begin{document}

     \MacroTestTwo{1/2/3}

\end{document}

我希望能够在 MacroTestOne 中访问传递给 MacroTestTwo 的两个值。有没有简单的方法可以做到这一点?

答案1

假设你指的是正斜杠,你可以使用

\def\MacroTestOne#1{\zzz#1/\relax}
\def\zzz#1/#2/#3\relax{#2}


\def\MacroTestTwo#1{%
    \MacroTestOne{#1b}%
}%

\documentclass{article}

\begin{document}

     \MacroTestTwo{1/2/3}

\end{document}

这使得2 我确实想知道你是否打算2b在这种情况下,定义应该是

\def\MacroTestTwo#1{%
    \MacroTestOne{#1}b%
}%

答案2

如果您想要任意长度的列表,使用逗号作为分隔符会更方便:

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\extractitem}{smm}
 {
  \IfBooleanTF{#1}
   {
    \clist_item:Vn #3 { #2 }
   }
   {
    \clist_item:nn { #3 } { #2 }
   }
 }
\cs_generate_variant:Nn \clist_item:nn { V }
\ExplSyntaxOff

\begin{document}

\newcommand{\mylist}{1,2,3,4,5}

\extractitem{2}{1,2,3,4,5}

\extractitem*{4}{\mylist}

\end{document}

如果您坚持使用斜线,则需要复制代码\clist_item:nn

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn

\cs_new:Npn \kevin_slashlist_item:nn #1#2
  {
    \kevin__slashlist_item:ffnN
      { \kevin_slashlist_count:n {#1} }
      { \int_eval:n {#2} }
      {#1}
      \kevin__slashlist_item_n:nw
  }
\cs_new:Npn \kevin__slashlist_item:nnnN #1#2#3#4
  {
    \int_compare:nNnTF {#2} < 0
      {
        \int_compare:nNnTF {#2} < { - #1 }
          { \use_none_delimit_by_q_stop:w }
          { \exp_args:Nf #4 { \int_eval:n { #2 + 1 + #1 } } }
      }
      {
        \int_compare:nNnTF {#2} > {#1}
          { \use_none_delimit_by_q_stop:w }
          { #4 {#2} }
      }
    { } / #3 / \q_stop
  }
\cs_generate_variant:Nn \kevin__slashlist_item:nnnN { ffo, ff }
\cs_new:Npn \kevin__slashlist_item_n:nw #1
  { \kevin__slashlist_item_n_loop:nw {#1} \prg_do_nothing: }
\cs_new:Npn \kevin__slashlist_item_n_loop:nw #1 #2/
  {
    \exp_args:No \tl_if_blank:nTF {#2}
      { \kevin__slashlist_item_n_loop:nw {#1} \prg_do_nothing: }
      {
        \int_compare:nNnTF {#1} = 0
          { \exp_args:No \kevin__slashlist_item_n_end:n {#2} }
          {
            \exp_args:Nf \kevin__slashlist_item_n_loop:nw
              { \int_eval:n { #1 - 1 } }
              \prg_do_nothing:
          }
      }
  }
\cs_new:Npn \kevin__slashlist_item_n_end:n #1 #2 \q_stop
  { \tl_trim_spaces_apply:nN {#1} \kevin__slashlist_item_n_strip:n }
\cs_new:Npn \kevin__slashlist_item_n_strip:n #1 { \kevin__slashlist_item_n_strip:w #1 / }
\cs_new:Npn \kevin__slashlist_item_n_strip:w #1 / { \exp_not:n {#1} }

\cs_new:Npx \kevin_slashlist_count:n #1
  {
    \exp_not:N \int_eval:n
      {
        0
        \exp_not:N \kevin__slashlist_count:w \c_space_tl
        #1 \exp_not:n { / \q_recursion_tail / \q_recursion_stop }
      }
  }
\cs_new:Npn \kevin__slashlist_count:n #1 { + 1 }
\cs_new:Npx \kevin__slashlist_count:w #1 /
  {
    \exp_not:n { \exp_args:Nf \quark_if_recursion_tail_stop:n } {#1}
    \exp_not:N \tl_if_blank:nF {#1} { + 1 }
    \exp_not:N \kevin__slashlist_count:w \c_space_tl
  }

\NewExpandableDocumentCommand{\slashlistitem}{smm}
 {
  \IfBooleanTF{#1}
   {
    \kevin_slashlist_item:Vn #3 { #2 }
   }
   {
    \kevin_slashlist_item:nn { #3 } { #2 }
   }
 }
\cs_generate_variant:Nn \kevin_slashlist_item:nn { V }

\ExplSyntaxOff

\begin{document}

\newcommand{\mylist}{1/2/3/4/5}

\slashlistitem{2}{1/2/3/4/5}

\slashlistitem*{4}{\mylist}

\end{document}

两个示例文档的打印内容相同。

在此处输入图片描述

相关内容