我有一个关于宏定义分解的问题:
第十五章第 7 节接口3manual 是可能的分解列表:
例如,\token_get_prefix_spec:N
interface3 手册中列出了一个命令。如所述,它将前缀留在输入流中。
由 定义的标记\cs_new_protected:Nn \someToken:n { do~something }
将因此保留“\protected”。
另外两个,\token_get_arg_spec:N
和\token_get_replacement_spec:N
,保留原始参数或替换。这三个都可以很好地与\l_peek_token
作为“输入”一起使用。
但是有没有方法可以保留令牌名称?宏\token_to_str:N
不是一个选项,因为我想知道(一旦展开)的名称\l_peek_token
:\token_to_str:N \l_peek_token
只返回“\l_peek_token”而不是“\someToken:n”(如果偷看的令牌是“\someToken:n”)。
这是一个展示我想要的内容的小示例(使用 XeTeX 编译):
\documentclass[varwidth,border=10pt]{standalone}
\usepackage{expl3}
\usepackage{newunicodechar}
\ExplSyntaxOn
\cs_new_protected:Nn \someToken:n {
\peek_catcode:NF ## {
char: #1\\
-~Meaning~of~next~token:~\token_to_meaning:N \l_peek_token\\
-~Prefix~of~next~token:~\token_get_prefix_spec:N \l_peek_token\\
-~Name~of~next~token:~\token_to_str:N \l_peek_token\\ % this is not working as wanted, I want \someToken:n !
}
}
\newunicodechar{➀}{\someToken:n{a}}
\newunicodechar{➁}{\someToken:n{b}}
\ExplSyntaxOff
\begin{document}
➁➀
…
\end{document}
(我在寻找其他问题的解决方案时出现了这个问题比较宏名称而不是含义和预览并处理角色。
答案1
如果您想提取宏定义中的第一个标记(这需要是用户定义的宏而不是原始的,否则可能会出现出现错误的情况)。
\ExplSyntaxOn
\cs_new:Npn \fjs_string_first_delimit_q_nil:Nw #1 #2 \q_nil { \token_to_str:N #1 }
\cs_new_protected:Nn \fjs_sometoken:n
{
\peek_catcode:NF ##
{
char: ~ #1 \\
Meaning ~ of ~ next ~ token: ~ \token_to_meaning:N \l_peek_token \\
\token_if_macro:NT \l_peek_token
{
First ~ token ~ inside ~ the ~ next ~ token: ~
\exp_after:wN \fjs_string_first_delimit_q_nil:Nw \l_peek_token aaaaaaaaa \q_nil
}
\par
}
}
\newunicodechar{➀}{\fjs_sometoken:n{a}}
\newunicodechar{➁}{\fjs_sometoken:n{b}}
\ExplSyntaxOff
这并不完全安全(例如,\def\foo{{}}
如果下一个标记是,则会导致问题\foo
),但目前这在您的情况下效果很好➀➁。
答案2
@HenriMenke(无意中?)给了我一个想法,即解析子字符串以\meaning
检查是否\l_peek_token
为“\someToken:n”。以下是一些解释这个答案我得到了以下工作代码。
\documentclass[varwidth,border=10pt]{standalone}
\usepackage{expl3}
\usepackage{newunicodechar}
\ExplSyntaxOn
\tl_new:N \l_my_tl
\seq_new:N \l_my_seq
\cs_generate_variant:Nn \regex_extract_once:nnNTF { nV }
\cs_new_protected:Nn \someToken:n {
\peek_catcode:NF ## {
char: #1\\
-~Meaning~of~next~token:~\token_to_meaning:N \l_peek_token\\
\tl_set:Nx \l_my_tl { \token_to_meaning:N \l_peek_token }
\regex_extract_once:nVNTF { macro:->\\someToken:n } \l_my_tl \l_my_seq {
-~Real~name~of~next~token:~\textbackslash someToken:n
}{
-~Real~name~of~next~token:~unknown
}\\
}
}
\newunicodechar{➀}{\someToken:n{a}}
\newunicodechar{➁}{\someToken:n{b}}
\begin{document}
➁➀
…
\end{document}
这个解决方案看起来像是黑客行为。除非有人告诉我没有更好的解决方案,否则我不能将其标记为可接受的答案 :-(