在纯 TeX 中,如何创建项目堆栈?我需要能够将项目推到列表末尾、弹出项目并输出完整的项目列表。
例如
\createlist{\mylist}
\push{\mylist}{A}
\push{\mylist}{-B}
\push{\mylist}{-C}
\print{\mylist} % prints A-B-C
\pop{\mylist} % Removes `-C'
\print{\mylist} % prints A-B
我发现listings.sty
似乎有推动(用\lst@lAddToa
)但没有弹出(虽然我不确定,因为此功能文档很少)。
答案1
A 期望堆栈从前面而不是末尾开始构建,因此这里我反转了堆栈\print
这假设物品中的代币在\edef
\catcode`\!=4
\def\createlist#1{\def#1{}}
\def\push#1#2{\edef#1{#2!#1}}
\def\pop#1{\edef#1{\expandafter\xpop#1}}
\def\xpop#1!{}
\def\print#1{\expandafter\xprint#1!\xpop!\relax}
\def\xprint#1!#2\relax{\ifx\xpop#1\else\xprint#2\relax#1\fi}
\catcode`\!=12
\createlist{\mylist}
\push{\mylist}{A}
\push{\mylist}{-B}
\push{\mylist}{-C}
\print{\mylist} % prints A-B-C
\pop{\mylist} % Removes `-C'
\print{\mylist} % prints A-B
\bye
答案2
只是为了完整性,如果您使用的是带有 ε-TeX 的 TeX 引擎(即不是 Knuth TeX),那么您可以使用seq
来自的变量expl3
,它具有您想要的大多数堆栈功能:
\input expl3-generic
\ExplSyntaxOn
\tl_new:N \lastpop
\cs_new_eq:NN \createlist \seq_new:N
\cs_new_eq:NN \push \seq_push:Nn
\cs_new_protected:Npn \pop #1
{ \seq_pop:NN #1 \lastpop }
\cs_new_protected:Npn \print #1
{
\tl_clear:N \lastpop
\seq_map_inline:Nn #1
{ \tl_put_left:Nn \lastpop {##1} }
\tl_use:N \lastpop
}
\ExplSyntaxOff
\createlist{\mylist}
\push{\mylist}{A}
\push{\mylist}{-B}
\push{\mylist}{-C}
\print{\mylist} % prints A-B-C
\pop{\mylist} % Removes `-C' (`-C' is available in \lastpop)
\print{\mylist} % prints A-B
\bye