创建项目堆栈

创建项目堆栈

在纯 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

相关内容