我想使用环境来填充垂直棺材。我发现我可以用这种方式填充棺材,但杆子会丢失,因为顶部杆子 (t) 被视为位于棺材底部(宽度也会丢失)。我必须手动设置杆子。
所以,我的问题是,是否有办法在不丢失杆子的环境中装载垂直棺材。在下面的 MWE 中,我的使用\global
是一种黑客行为,因此也可能是问题的原因。
注意:a)我需要使用一个环境来与其他代码兼容...我知道可以直接得到最终结果,而无需在环境中设置棺材,也不会丢失杆子;b)我见过此主题及其答复,但它们并没有完全回答我的问题。
\documentclass[10pt]{article}
\usepackage{xcoffins,lipsum,xparse}
\NewCoffin{\CoffinA}
\NewCoffin{\CoffinB}
\DeclareDocumentCommand\SetCoffinB{m}{%
\SetVerticalCoffin{\CoffinB}{100mm}{#1}
}
\NewDocumentEnvironment{coffinB}{+b}{%
\global\SetCoffinB{\noindent#1}%
}{}
\begin{document}
\SetVerticalCoffin{\CoffinA}{100mm}{%
{\Large\bfseries\noindent A Big Heading}%
}
\begin{coffinB}
\lipsum[1]
\end{coffinB}
\SetHorizontalPole \CoffinB {t} {\TotalHeight} % <=== why should this be necessary?
\JoinCoffins\CoffinA[l,b]\CoffinB[l,t](0pt,0pt)
\TypesetCoffin\CoffinA
\end{document}
如果没有该\SetHorizontalPole
命令,我会得到这个结果,就好像顶部的杆子位于 CoffinB 的底部:
对于\SetHorizontalPole
CoffinB 的顶杆,我得到了这个结果,这基本上就是我想要的:
答案1
\global
只能在 tex 原始赋值之前使用。如果在宏之前使用它,那么它可能会使该宏扩展中的第一个内部赋值成为全局赋值,也可能什么也不做,也可能产生错误,具体取决于宏的内部实现。当然,对于需要对盒子数据本身和所有极点结构进行多次链接赋值的棺材来说,单个赋值\global
不可能起作用。
如果你使用
\NewDocumentEnvironment{coffinB}{+b}{%
\gdef\tmp{\SetCoffinB{\noindent#1}}\aftergroup\tmp
}{}
那么环境的主体将被包装在调用中但不会被执行,而是(全局地)保存在组外执行的\SetCoffinB
宏中,因此本质上是在环境完成后。\tmp
与任何全局变量的使用一样,这也有一些限制,任何嵌套使用都会中断,因为内部使用会全局覆盖,从而搞乱\tmp
外部使用。代码可以变得更健壮,只需将定义偷偷带过一个分组级别,而无需使用全局赋值,但如果不需要嵌套使用,这会更简单。