有没有简单的方法可以提前查看数字?比如
\peek_charcode:NTF [0-9]
处理第 10 个巢的方法\peek_charcode:NTF
相当麻烦。
我只想匹配数字。数字、括号和其他字符共享相同的 catcode。
答案1
站在巨人的肩膀上,并扩展了 Manuel 的想法,我想出了这个解决方案。我认为, a\regex_peek:nTF
用途非常广泛,应该将其添加到 中l3regex
。
\documentclass{scrartcl}
\usepackage{expl3}
\usepackage{l3regex}
\begin{document}
\ExplSyntaxOn
\cs_generate_variant:Nn \regex_match:nnTF { no }
\cs_new_protected:Npn \mh_regex_peek:nTF #1 #2 #3
{
\peek_catcode:NTF ##
{#3}
{
\regex_match:noTF
{ \A the\ (character|letter)\ (#1) \Z }
{ \token_to_meaning:N \l_peek_token } {#2} {#3}
}
}
\mh_regex_peek:nTF { [0-9] } { digit: ~ } { no ~ digit: ~ } 1 \par
\mh_regex_peek:nTF { [0-9] } { digit: ~ } { no ~ digit: ~ } 2 \par
\mh_regex_peek:nTF { [0-9] } { digit: ~ } { no ~ digit: ~ } ( \par
\mh_regex_peek:nTF { [0-9] } { digit: ~ } { no ~ digit: ~ } {1} ~ (group) \par
\mh_regex_peek:nTF { [a] } { is ~ letter ~ a: ~ } { not ~ letter ~ a: ~ } 1 \par
\mh_regex_peek:nTF { [a] } { is ~ letter ~ a: ~ } { not ~ letter ~ a: ~ } a \par
\mh_regex_peek:nTF { [abc] } { is ~ a, ~ b ~ or ~ c: ~ } { not ~ a, ~ b ~ or ~ c: ~ } b \par
\mh_regex_peek:nTF { a|b|c } { is ~ a, ~ b ~ or ~ c: ~ } { not ~ a, ~ b ~ or ~ c: ~ } b \par
\mh_regex_peek:nTF { a|b|c } { is ~ a, ~ b ~ or ~ c: ~ } { not ~ a, ~ b ~ or ~ c: ~ } e \par
\end{document}
编辑:通过过滤 #,变得更加强大
编辑:切换到正则表达式{ \A the\ (character|letter)\ (#1) \Z }
。如果有人知道一种转换为标记列表的好方法\l_peek_token
,那么我就可以摆脱这种解决方法。附言:看来 Egreg 同时也抱有非常类似的想法。
聚苯硫醚该解决方案目前正在mhchem v4.00中使用。
答案2
一个起点(来自一个对 的深层内部一无所知的人expl3
,对我来说,这只是似乎有效)。我想用,\token_case:NnTF
但是该功能不存在。
\documentclass{scrartcl}
\usepackage{xparse}
\ExplSyntaxOn
\cs_new_protected:Npn \mh_peek_case:nTF #1 #2 #3
{
\cs_set_nopar:Npn \__mh_peek_case:w
{
\tl_case:NnTF \l_peek_token { #1 } { #2 } { #3 }
}
\peek_after:Nw \__mh_peek_case:w
}
\NewDocumentCommand \checkfordigit { }
{
\mh_peek_case:nTF
{
{0}{} {1}{} {2}{} {3}{} {4}{}
{5}{} {6}{} {7}{} {8}{} {9}{}
}
{ Next ~ token ~ is ~ a ~ digit: ~ }
{ Next ~ token ~ is ~ not ~ a ~ digit: ~ }
}
\ExplSyntaxOff
\begin{document}
\checkfordigit 1 \par
\checkfordigit 2 \par
\checkfordigit A \par
\checkfordigit -- \par
\end{document}
如果您不介意的话,\checkfordigit{1}
您可以用 来定义它\tl_set:Nn \l_tmpa_tl {#1} \tl_case:NnTF \l_tmpa_tl { .. } { .. } { .. }
。
答案3
的想法\peek_regex:NTF
很好,但是它有一个问题:\token_to_meaning:N \l_peek_token
当以下标记是时,0
的扩展是
the character 0
所以在你的情况下
\mh_peek_regex:nTF { a } { true } { false } 0
将返回true
,因为a
匹配the character 0
。
如果你限制自己寻找字符而不是其他标记,那么这个想法就可以奏效,仍然允许第一个参数中的范围:
\documentclass{scrartcl}
\usepackage{expl3}
\usepackage{l3regex}
\begin{document}
\ExplSyntaxOn
\cs_generate_variant:Nn \regex_match:nnTF { nV }
\tl_new:N \l__mh_char_peek_tl
\cs_new_protected:Npn \mh_char_peek:nTF #1 #2 #3
{
\peek_catcode:NTF ##
{ #3 }
{
\tl_set:Nx \l__mh_char_peek_tl { \token_to_meaning:N \l_peek_token }
\regex_match:nVTF { \A the } \l__mh_char_peek_tl
{
\regex_replace_once:nnN { \A the \s .* \s } { } \l__mh_char_peek_tl
\regex_match:nVTF {#1} \l__mh_char_peek_tl {#2} {#3}
}
{ #3 }
}
}
\mh_char_peek:nTF { [0-9] } { digit: ~ } { no ~ digit: ~ } 1 \par
\mh_char_peek:nTF { [0-9] } { digit: ~ } { no ~ digit: ~ } 2 \par
\mh_char_peek:nTF { [0-9] } { digit: ~ } { no ~ digit: ~ } ( \par
\mh_char_peek:nTF { [0-9] } { digit: ~ } { no ~ digit: ~ } {1} ~ (group) \par
\mh_char_peek:nTF { [0-9] } { digit: ~ } { no ~ digit: ~ } - \par
\mh_char_peek:nTF { a } { is ~ letter ~ a: ~ } { not ~ letter ~ a: ~ } 0 \par
\mh_char_peek:nTF { [a-z] } { is ~ letter ~ a: ~ } { not ~ letter ~ a: ~ } a \par
\end{document}
我检查的扩展是否\token_to_meaning:N \l_peek_token
以和开头the
,在这种情况下,我知道它要么是the character <?>
,要么the letter <?>
是,所以我可以从该扩展中删除不需要的标记并进行正确的检查。
可以使用适当的功能继续进行其他标记的测试\peek_...:NTF
。