如何将 LaTeX3 标记列表作为标记列表而不是项目列表处理?

如何将 LaTeX3 标记列表作为标记列表而不是项目列表处理?

有没有办法将 LaTeX3 标记列表作为标记列表而不是项目列表进行查询和操作?例如,给定标记列表

{a}b

是否有可能找出它包含多少个标记(4),并访问列表中的第一个标记({)?

答案1

您可以使用 Bruno 的gtl包裹为此。该包执行一些极其重要的任务,并且有很多微妙之处,因此您必须如果您想使用它,请阅读文档。

与此同时,我看不出“深度计数”代币有什么用处。这可能是一个XY问题,即您的设计存在缺陷,并且存在更简单的解决方案,但您没有告诉我们实际的问题。

\documentclass{article}
\usepackage{gtl}

\begin{document}

\ExplSyntaxOn

\gtl_new:N \l_evan_test_gtl

\gtl_set:Nn \l_evan_test_gtl { {a}b }

% get count
\gtl_count_tokens:N \l_evan_test_gtl

% access first token
\gtl_head_do:NN \l_evan_test_gtl \token_to_str:N

\ExplSyntaxOff

\end{document}

答案2

如果你想将标记列表的“标记长度”存储到整数变量中,那么你可以这样做

\regex_count:nnN { . } { {a} b } \l_tmpa_int

访问第 n 个标记可能会变得非常困难,因为 TeX 不允许宏定义中出现不平衡的文本。对于非括号:

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\cs_new_protected:Nn \aad_tokens_count:Nn
 { % #1 = int variable, #2 = token list
  \regex_count:nnN { . } { #2 } #1
 }

\int_new:N \l__aad_tokens_count_int
\tl_new:N \l__aad_tokens_temp_tl

\cs_new_protected:Nn \aad_tokens_get:nnn
 { % #1 = control sequence name, #2 = integer, #3 = token list
  \regex_count:nnN { . } { #3 } \l__aad_tokens_count_int
  \int_compare:nT { 1 <= #2 <= \l__aad_tokens_count_int }
   {
    \tl_set:Nn \l__aad_tokens_temp_tl { #3 }
    \regex_replace_once:xnN
     {
      \exp_not:N \A
      \prg_replicate:nn { #2 - 1 } { . }
      (.)
      .*
     }
     { \c{cs_set_eq:NN}\c{#1}\1 }
     \l__aad_tokens_temp_tl
     \tl_use:N \l__aad_tokens_temp_tl
    }
 }
\cs_generate_variant:Nn \regex_replace_once:nnN { x }

\aad_tokens_get:nnn {foo} { 2 } { {a}b }

\cs_show:N \foo

这将显示

> \foo=the letter a.

答案3

如果您只需要计算标记,tokcycle可以轻松做到这一点,包括空格。

\documentclass{article}
\usepackage{tokcycle}
\xtokcycleenvironment\counttoks
{\addcytoks{+1}}
{\addcytoks{+2}\processtoks{##1}}
{\addcytoks{+1}}
{\addcytoks{+1}}
{\stripgroupingtrue}
{\the\numexpr}
\begin{document}
\counttoks abc\endcounttoks

\counttoks a{bc}\endcounttoks

\counttoks a \relax{b{c{d e f}}}\endcounttoks
\end{document}

在此处输入图片描述

如果需要知道第一个标记是否为 cat-1,则在标记循环\futurelet\firsttok之前和之后应用,并使用以下方法测试等效性:\counttoks\firsttok\bgroup

\documentclass{article}
\usepackage{tokcycle}
\xtokcycleenvironment\counttoks
{\addcytoks{+1}}
{\addcytoks{+2}\processtoks{##1}}
{\addcytoks{+1}}
{\addcytoks{+1}}
{\stripgroupingtrue}
{\the\numexpr}
\newcommand\counttoksplus[1]{%
  \futurelet\firsttok\counttoks #1\endcounttoks\ 
  First token \ifx\firsttok\bgroup\else NOT \fi cat-1}
\begin{document}
\counttoksplus{abc}

\counttoksplus{{bc}}
\end{document}

在此处输入图片描述

答案4

如果标记列表不包含控制序列,则可以通过将列表视为字符串并使用 检索字符串的长度来获取其长度\str_count:...。例如,4使用 pdftex 编译时,以下手稿排版。

\documentclass{article}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
    \str_count:n {{a}b}
\ExplSyntaxOff
\end{document}

相关内容