如何访问作为参数传入的以正斜杠分隔的列表中的一个元素?
\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}
两个示例文档的打印内容相同。