我正在尝试通过重新实现一些宏和小包来学习 expl3,以利用它。
我现在想知道是否有更像 latex3 的方式来做类似的事情
\raisebox{-\height+\baselineskip}{#1}
这要求calc
,鉴于 应该具备对维度进行计算的能力expl3
。
答案1
这是一个可能的重新定义,使用键值接口而不是多个可选参数来设置最终的高度和深度。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\xraisebox}{O{}mm}
{
\leavevmode
\group_begin:
\keys_set:nn { x/raisebox }
{
height=,
depth=,
#1
}
\x_raisebox:nn { #2 } { #3 }
\group_end:
}
\keys_define:nn { x/raisebox }
{
height .tl_set:N = \l__x_raisebox_ht_tl,
depth .tl_set:N = \l__x_raisebox_dp_tl,
}
\box_new:N \l__x_raisebox_in_box
\box_new:N \l__x_raisebox_out_box
\dim_new:N \l__x_raisebox_height_dim
\dim_new:N \l__x_raisebox_depth_dim
\dim_new:N \l__x_raisebox_totalheight_dim
\dim_new:N \l__x_raisebox_width_dim
\cs_new_protected:Nn \x_raisebox:nn
{
\hbox_set:Nn \l__x_raisebox_in_box { #2 }
\cs_set_eq:NN \height \l__x_raisebox_height_dim
\cs_set_eq:NN \depth \l__x_raisebox_depth_dim
\cs_set_eq:NN \totalheight \l__x_raisebox_totalheight_dim
\cs_set_eq:NN \width \l__x_raisebox_width_dim
\dim_set:Nn \l__x_raisebox_height_dim { \box_ht:N \l__x_raisebox_in_box }
\dim_set:Nn \l__x_raisebox_depth_dim { \box_dp:N \l__x_raisebox_in_box }
\dim_set:Nn \l__x_raisebox_totalheight_dim { \height+\depth }
\dim_set:Nn \l__x_raisebox_width_dim { \box_wd:N \l__x_raisebox_in_box }
\hbox_set:Nn \l__x_raisebox_out_box
{
\box_move_up:nn { #1 } { \box_use_drop:N \l__x_raisebox_in_box }
}
\tl_if_empty:NF \l__x_raisebox_ht_tl
{
\box_set_ht:Nn \l__x_raisebox_out_box { \dim_eval:n { \l__x_raisebox_ht_tl } }
}
\tl_if_empty:NF \l__x_raisebox_dp_tl
{
\box_set_dp:Nn \l__x_raisebox_out_box { \dim_eval:n { \l__x_raisebox_dp_tl } }
}
\box_use_drop:N \l__x_raisebox_out_box
}
\ExplSyntaxOff
\begin{document}
x\raisebox{3pt}{y\raisebox{3pt}{z}}
x\xraisebox{3pt}{y\xraisebox{3pt}{z}}
\setlength{\fboxsep}{0pt}
\fbox{\xraisebox{3pt}{y}}
\fbox{x\xraisebox{3pt}{y\xraisebox{3pt}{z}}}
\fbox{x\xraisebox{3pt}{y\xraisebox[height=0pt]{3pt}{z}}}
\fbox{x\xraisebox{3pt}{y\xraisebox[height=3pt+0.5\height]{3pt}{z}}}
\fbox{x\xraisebox{-3pt}{y\xraisebox{-3pt}{z}}}
\fbox{x\xraisebox{-3pt}{y\xraisebox[depth=0pt]{-3pt}{z}}}
\fbox{x\xraisebox{-3pt}{y\xraisebox[depth=20pt]{-3pt}{z}}}
\end{document}
命令\height
、\depth
和\totalheight
是\width
本地设置的,用于使某些内部尺寸相等。每个框都构建在一个组内,以便进行嵌套。
答案2
好像棺材可以提供帮助,例如,以下函数可以提供不同类型的垂直对齐:
\NewDocumentCommand { \Vadj } { O{m} m }
{
% Beware, this gets out of math mode, so if you are in math mode, you need
% to re-enter it.
\hcoffin_set:Nn \l_tmpa_coffin { #2 }
\str_case:nn { #1 }
{
{ t }
{
\coffin_typeset:Nnnnn \l_tmpa_coffin {l}{H}{0pt}
{ -\coffin_ht:N \l_tmpa_coffin }
}
{ m }
{
\coffin_typeset:Nnnnn \l_tmpa_coffin {l}{H}{0pt}
{ -0.5\coffin_ht:N \l_tmpa_coffin + 0.5\coffin_dp:N
\l_tmpa_coffin }
}
{ b }
{
\coffin_typeset:Nnnnn \l_tmpa_coffin {l}{H}{0pt}
{ \coffin_dp:N \l_tmpa_coffin }
}
}
}
就像\risebox
,这会让您退出数学模式,因此如果您处于数学模式,则需要重新进入。
expl3
由于我才刚开始学习,所以不能 100% 确定这是否是正确的代码,但它似乎可以完成工作。