如何在 \tl_map_function 中使用 \makebox?

如何在 \tl_map_function 中使用 \makebox?

在尝试回答时LaTeX 音乐我遇到了无法\makebox在函数内部使用\tl_map_function:NN调用的问题。以下代码中注释掉了有问题的行。

通过该行我得到这个错误:

! Undefined control sequence.
<argument> \LaTeX3 error: 
                           Erroneous variable \color@endgroup used!
l.43 \function{T}{3---4, ..7-8}

当用例如替换参数#1中的时,没有错误。在参数中使用和时,我得到相同的错误。\makeboxx\tl_set:Nn \l_tmpa_tl { #1 }\tl_use:N \l_tmpa_tl

\makebox那么在这种情况下我如何使用(或另一个固定宽度的框)?

代码:

\documentclass{article}

\usepackage{xparse}

\ExplSyntaxOn

\dim_new:N \l_palamas_boxwidth_dim
\dim_set:Nn \l_palamas_boxwidth_dim { 0.5em }

\tl_new:N \g_palamas_line_tl
\tl_set:Nn \g_palamas_line_tl { \rule [ 0.7ex ] { \dim_use:N \l_palamas_boxwidth_dim } { 0.3pt } }
\tl_new:N \g_palamas_space_tl
\tl_set:Nn \g_palamas_space_tl { \hspace { \dim_use:N \l_palamas_boxwidth_dim }  }

\cs_new:Npn \palamas_makebox:n #1 {
% DOESN'T WORK:
%   \makebox [ \dim_use:N \l_palamas_boxwidth_dim ] [ r ] { #1 }
% DOESN'T WORK:
   \tl_set:Nn \l_tmpa_tl { #1 }
   \makebox [ \dim_use:N \l_palamas_boxwidth_dim ] [ r ] { \tl_use:N \l_tmpa_tl }
% WORKS:
%   #1
}
\cs_new:Npn \palamas_process_list:n #1 {
   \tl_set:Nn \l_tmpa_tl { #1 }
   \tl_replace_all:Nnn \l_tmpa_tl { - } { \tl_use:N \g_palamas_line_tl }
   \tl_replace_all:Nnn \l_tmpa_tl { . } { \tl_use:N \g_palamas_space_tl }
   \tl_map_function:NN \l_tmpa_tl \palamas_makebox:n
   \\
}

\NewDocumentCommand { \function } { m O{0.1em} m } {
   #1
   \clist_set:Nn \l_tmpa_clist { #3 }
   \kern#2
   {
      \tiny
      \begin{tabular}[b]{@{}l@{}}
         \clist_map_function:NN \l_tmpa_clist \palamas_process_list:n
         \int_compare:nT { \clist_count:N \l_tmpa_clist < 3 } { \\ }
      \end{tabular}
   }
}

\ExplSyntaxOff

\begin{document}
\function{T}{3---4, ..7-8} \qquad
\function{D}{4---3, 6-5, ..7-8} \qquad
\function{D}{{11}---,4---3, 6-5--, ..7-8} \qquad
\function{s}{6,5}
\end{document}

答案1

问题是你正在映射一个令牌列表,并且

\tl_use:N \g_palamas_line_tl

标记列表中的不同项目\palamas_makebox:n { \tl_use:N }最终会产生错误。

要么支撑物品

\tl_replace_all:Nnn \l_tmpa_tl { - } { {\tl_use:N \g_palamas_line_tl} }
\tl_replace_all:Nnn \l_tmpa_tl { . } { {\tl_use:N \g_palamas_space_tl} }

或者直接删除\tl_use:N。顺便说一句,\cs_new_protected:Npn在有 的两种情况下,您都应该使用\cs_new:Npn; 并且\dim_use:N在每个有 的地方都是错误的。

相关内容