30 关于stackengine宏包排版多行文本居中分散对齐的问题

发布于 2022-04-07 20:24:00

我现有下列的代码,目前使用makebox实现了分散对齐,我的问题是能否再智能一点,让代码自动判断最长的文本,然后文本分散对齐?

\documentclass{ctexart}
\usepackage[usestackEOL]{stackengine}
\def\stacktype{L}
\strutlongstacks{T}
\begin{document}
{\Large
朋友!
\Centerstack{诸葛八卦村\\\makebox[5em][s]{地下长河}\\\makebox[5em][s]{芝堰水库}}
欢迎您去游览!
}
\end{document}

86c9eecdd2c494a30c578fc959db47e.jpg

查看更多

关注者
0
被浏览
830
雾月
雾月 2022-04-07
这家伙很懒,什么也没写!
\ExplSyntaxOn
\cs_new_protected_nopar:Npn \autoCenterstack #1
  {
    \group_begin:
    \dim_zero:N \l_tmpa_dim
    \tl_clear:N \l_tmpa_tl
    \seq_set_split:Nnn \l_tmpa_seq { \\ } { #1 }
    \seq_pop_right:NN \l_tmpa_seq \l_tmpb_tl
    \seq_map_inline:Nn \l_tmpa_seq
      {
        \hbox_set:Nn \l_tmpa_box {##1}
        \dim_compare:nNnT { \box_wd:N \l_tmpa_box } > \l_tmpa_dim
          { \dim_set:Nn \l_tmpa_dim { \box_wd:N \l_tmpa_box } }
        \tl_put_right:Nn \l_tmpa_tl { \makebox[\l_tmpa_dim][s]{##1} \\ }
      }
    \hbox_set:Nn \l_tmpa_box { \l_tmpb_tl }
    \dim_compare:nNnT { \box_wd:N \l_tmpa_box } > \l_tmpa_dim
      { \dim_set:Nn \l_tmpa_dim { \box_wd:N \l_tmpa_box } }
    \tl_put_right:Nx \l_tmpa_tl { \exp_not:N \makebox [\l_tmpa_dim] [s] { \exp_not:o \l_tmpb_tl } }
    \exp_args:No \Centerstack { \l_tmpa_tl }
    \group_end:
  }
\ExplSyntaxOff

基本思路是按 \\ 分割 tl,然后计算这些 tl 的构成的盒子的最大宽度,然后使用这个最大宽度。

如果要保留 \\ 前后的空格,将 \seq_set_split:Nnn 换成 \seq_set_split_keep_spaces:Nnn

\documentclass{ctexart}
\usepackage[usestackEOL]{stackengine}
\def\stacktype{L}
\strutlongstacks{T}
\begin{document}

\ExplSyntaxOn
\cs_new_protected_nopar:Npn \autoCenterstack #1
  {
    \group_begin:
    \dim_zero:N \l_tmpa_dim
    \tl_clear:N \l_tmpa_tl
    \seq_set_split:Nnn \l_tmpa_seq { \\ } { #1 }
    \seq_pop_right:NN \l_tmpa_seq \l_tmpb_tl
    \seq_map_inline:Nn \l_tmpa_seq
      {
        \hbox_set:Nn \l_tmpa_box {##1}
        \dim_compare:nNnT { \box_wd:N \l_tmpa_box } > \l_tmpa_dim
          { \dim_set:Nn \l_tmpa_dim { \box_wd:N \l_tmpa_box } }
        \tl_put_right:Nn \l_tmpa_tl { \makebox[\l_tmpa_dim][s]{##1} \\ }
      }
    \hbox_set:Nn \l_tmpa_box { \l_tmpb_tl }
    \dim_compare:nNnT { \box_wd:N \l_tmpa_box } > \l_tmpa_dim
      { \dim_set:Nn \l_tmpa_dim { \box_wd:N \l_tmpa_box } }
    \tl_put_right:Nx \l_tmpa_tl { \exp_not:N \makebox [\l_tmpa_dim] [s] { \exp_not:o \l_tmpb_tl } }
    \exp_args:No \Centerstack { \l_tmpa_tl }
    \group_end:
  }
\ExplSyntaxOff

{\Large
朋友!%
\autoCenterstack{诸葛八卦村\\ 地下长河\\ 芝堰水库}%
欢迎您去游览!
}

{\Large
朋友!%
\Centerstack{诸葛八卦村\\\makebox[5em][s]{地下长河}\\\makebox[5em][s]{芝堰水库}}%
欢迎您去游览!
}

\end{document}

image.png

1 个回答

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览