下面是一个 MWE,它按应有的方式排版了“AB”。但是,如果取消注释\group_begin:
和\group_end:
,B 就会消失 — 即,尽管使用了全局附件命令,但附件似乎是在本地执行的。如果gattach
用替换gjoin
,它就会起作用,所以那命令是全局的。(如果用 替换gjoin
,join
B 会再次消失,这是应该的。)这是一个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
{