背景:我正在尝试编写一个 L3 函数,该函数返回给定数字的二进制扩展中的第 n 位。然而,让它工作起来却非常令人沮丧。
\documentclass{article}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
\tl_new:N \tl_bin % set up variable to store binary digits
\cs_new:Npn \get_bin_digit:nn #1#2 {
\tl_set:Nn \tl_bin {\int_to_bin:n {#1}} % store binary expansion in our variable
\tl_item:Nn \tl_bin {#2} % index into the variable storing the binary expansion
}
\get_bin_digit:nn{5}{2}
\ExplSyntaxOff
\end{document}
预期的行为是函数调用应输出“0”。数字 5 的二进制扩展中的第二位数字 101 是 0。然而,我得到的结果是“5”。我不知道这里发生了什么!
答案1
您必须扩展\int_to_bin:n
使用的结果\tl_set:Nx
。如果您只这样做
\tl_set:Nn \tl_bin {\int_to_bin:n {#1}}
结果\tl_bin
实际上是\int_to_bin:n {5}
。如果从左边数,则第一个标记是\int_to_bin:n
,第二个标记是5
(括号被忽略)。
此外,您的功能正在执行任务,因此应该受到保护。
\documentclass{article}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
\tl_new:N \tl_bin % set up variable to store binary digits
\cs_new_protected:Npn \get_bin_digit:nn #1#2 {
\tl_set:Nx \tl_bin {\int_to_bin:n {#1}} % store binary expansion in our variable
\tl_item:Nn \tl_bin {#2} % index into the variable storing the binary expansion
}
\get_bin_digit:nn{5}{2}
\ExplSyntaxOff
\end{document}
为了节省一些输入和临时变量,您还可以定义一个\tl_item:nn
扩展第一个参数的变体。
\documentclass{article}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
\cs_generate_variant:Nn \tl_item:nn { xn }
\cs_new_protected:Nn \get_bin_digit:nn
{
\tl_item:xn { \int_to_bin:n { #1 } } { #2 }
}
\get_bin_digit:nn { 5 } { 2 }
\ExplSyntaxOff
\end{document}