我的 LaTeX3 代码有什么问题?

我的 LaTeX3 代码有什么问题?

背景:我正在尝试编写一个 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}

相关内容