latex3 / expl3 相当于 \raisebox 的长度表达式

latex3 / expl3 相当于 \raisebox 的长度表达式

我正在尝试通过重新实现一些宏和小包来学习 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% 确定这是否是正确的代码,但它似乎可以完成工作。

相关内容