如何使用 expl3 弹出(右)标记列表?

如何使用 expl3 弹出(右)标记列表?

expl3包提供的\tl_put_right功能使我们能够将标记附加到标记列表变量当前内容的右侧:

\documentclass{article}
\usepackage{xparse}

\begin{document}
\ExplSyntaxOn

\tl_new:N \foo
\tl_set:Nn \foo {bar}

\begin{description}
\item[Before:]
  \foo
\item[Put right:]
  \tl_put_right:Nn \foo {s}
  \foo
\end{description}

\ExplSyntaxOff
\end{document}

但是我缺少一个\tl_pop_right类似的命令(对于序列确实存在:)\seq_pop_right

编辑:我对命令的想法\tl_pop_right是弹出其参数中给出的标记列表的内容:如果\l_tmpa_tl包含“baz”,\tl_pop_right:n {\l_tmpa_tl}则应在输入流中保留“ba”。

答案1

还有一个更强大的操作,即\tl_range:Nnn

\documentclass{article}
\usepackage{expl3}

\ExplSyntaxOn

\cs_new:Nn \db_tl_pop_left:NN
 {
  \tl_set:Nx #2 { \tl_range:Nnn #1 { 1 } { 1 } }
  \tl_set:Nx #1 { \tl_range:Nnn #1 { 2 } { \tl_count:N #1 } }
 }
\cs_new:Nn \db_tl_pop_right:NN
 {
  \tl_set:Nx #2 { \tl_range:Nnn #1 { -1 } { -1 } }
  \tl_set:Nx #1 { \tl_range:Nnn #1 { 1 } { \tl_count:N #1 - 1 } }
 }

\tl_set:Nn \l_tmpa_tl {{ab}cdef}

\db_tl_pop_right:NN \l_tmpa_tl \l_tmpb_tl

\tl_show:N \l_tmpa_tl
\tl_show:N \l_tmpb_tl

\db_tl_pop_left:NN \l_tmpa_tl \l_tmpb_tl

\tl_show:N \l_tmpa_tl
\tl_show:N \l_tmpb_tl

\stop

控制台上的输出是

> \l_tmpa_tl={ab}cde.
<recently read> }

l.21 \tl_show:N \l_tmpa_tl

? 
> \l_tmpb_tl=f.
<recently read> }

l.22 \tl_show:N \l_tmpb_tl

? 
> \l_tmpa_tl=cde.
<recently read> }

l.26 \tl_show:N \l_tmpa_tl

? 
> \l_tmpb_tl={ab}.
<recently read> }

l.27 \tl_show:N \l_tmpb_tl

您的更简单的功能可以实现为

\cs_new:Nn \db_tl_lastitem:n
 {
  \tl_range:nnn { #1 } { -1 } { -1 }
 }

完整示例

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn

\cs_new:Nn \db_tl_lastitem:n
 {
  \tl_range:nnn { #1 } { -1 } { -1 }
 }

\NewExpandableDocumentCommand{\lastitem}{m}
 {
  \db_tl_lastitem:n { #1 }
 }

\ExplSyntaxOff

\begin{document}

\lastitem{abcdef}

\lastitem{abcd{ef}}

\end{document}

在此处输入图片描述

如果你想扔掉最后一件物品:

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn

\cs_new:Nn \db_tl_nolastitem:n
 {
  \tl_range:nnn { #1 } { 1 } { \tl_count:n { #1 } - 1 }
 }

\NewExpandableDocumentCommand{\nolastitem}{m}
 {
  \db_tl_nolastitem:n { #1 }
 }

\ExplSyntaxOff

\begin{document}

\nolastitem{abcdef}

\nolastitem{abcd{ef}}

\end{document}

在此处输入图片描述

\tl_range:nnn和都在“候选”之列,但\tl_range:Nnn不必担心:这些函数很有用,应该保留。也许名字可以改一下。

对于“非候选人”:

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn

\cs_new:Nn \db_tl_nolastitem:n
 {
  \tl_reverse:f
   {
    \tl_tail:f
     {
      \tl_reverse:n { #1 }
     }
   }
 }
\cs_generate_variant:Nn \tl_tail:n { f }
\cs_generate_variant:Nn \tl_reverse:n { f }

\NewExpandableDocumentCommand{\nolastitem}{m}
 {
  \db_tl_nolastitem:n { #1 }
 }

\ExplSyntaxOff

\begin{document}

\nolastitem{abcdef}

\nolastitem{abcd{ef}}

\end{document}

相关内容