该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}