`\coffin_gattach:…` 真的不是全局的吗?

`\coffin_gattach:…` 真的不是全局的吗?

下面是一个 MWE,它按应有的方式排版了“AB”。但是,如果取消注释\group_begin:\group_end:,B 就会消失 — 即,尽管使用了全局附件命令,但附件似乎是在本地执行的。如果gattach用替换gjoin,它就会起作用,所以命令是全局的。(如果用 替换gjoinjoinB 会再次消失,这是应该的。)这是一个l3coffins错误吗?

我快速浏览了一下l3coffins源代码,发现在和attach命令中,局部/全局差异似乎以相同的方式处理join。定义\coffin_join:…\coffin_attach:…\coffin_set_eq:NN使用 ,而定义\coffin_gjoin:…和时\coffin_gattach:…使用\coffin_gset_eq:NN。这似乎应该有效,但不知何故似乎没有用?

(请注意,我还提供了一个简单的解决方法:如果在原始 MWE 中取消注释分组语句,那么 B 就会消失,并且一个取消注释该行\coffin_gset_eq:NN,B 再次出现,表明附件已正确执行,但在本地执行。)

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\coffin_new:N \coffin_a
\coffin_new:N \coffin_b

\hcoffin_set:Nn \coffin_a {A}
\hcoffin_set:Nn \coffin_b {B}

% \group_begin: % Hides the attachment
\coffin_gattach:NnnNnnnn \coffin_a H r \coffin_b H l {0pt} {0pt}
% \coffin_gset_eq:NN \coffin_a \coffin_a % Workaround
% \group_end:

\NewDocumentCommand \ShowCoffins { } {
    \coffin_typeset:Nnnnn \coffin_a H l {0pt} {0pt}
}
\ExplSyntaxOff

\begin{document}
\ShowCoffins
\end{document}

答案1

这是 中的一个错误\coffin_gattach:NnnNnnnn。 的定义中的最后一行\__coffin_attach:NnnNnnnnN应为:

  #9 #1 \l__coffin_aligned_coffin

其中#9\coffin_set_eq:NN\coffin_gset_eq:NN,具体取决于您使用的函数。但是代码是\coffin_set_eq:NN无条件使用的,因此分配始终是本地的。

现在固定的,并且应该在下一版本中正常运行:

--- a/l3kernel/l3coffins.dtx
+++ b/l3kernel/l3coffins.dtx
@@ -1984,7 +1984,7 @@
     \@@_offset_poles:Nnn #4
       { \l_@@_offset_x_dim } { \l_@@_offset_y_dim }
     \@@_update_vertical_poles:NNN #1 #4 \l_@@_aligned_coffin
-    \coffin_set_eq:NN #1 \l_@@_aligned_coffin
+    #9 #1 \l_@@_aligned_coffin
   }
 \cs_new_protected:Npn \@@_attach_mark:NnnNnnnn #1#2#3#4#5#6#7#8
   {

相关内容