有没有办法将 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}