寄存器
寄存器
这家伙很懒,什么也没写!

注册于 4年前

回答
173
文章
6
关注者
19

可以用xcoffins宏包的垂直盒子实现包装一下插图,不过会不会有其它问题我不能确定,你自己再试试。同样的处理方法,也许可以将列表环境丢在盒子里,然后看成一个图片用wrapfig2排版,可能能解决你的问题。

\documentclass{article}

\usepackage{kantlipsum,xgalley,tikz}

\usepackage{caption}
\usepackage{varwidth}
\usepackage{xcoffins}

\ExplSyntaxOn

\box_new:N \l_xwrapfig_fig_box
\box_new:N \l_xwrapfig_vfig_box
\box_new:N \l_xwrapfig_hfig_box
\dim_new:N \l_xwrapfig_wd_dim
\dim_new:N \l_xwrapfig_totalht_dim
\clist_new:N \l_xwrapfig_indents_clist
\int_new:N \l_xwrapfig_lines_int
\int_new:N \l_xwrapfig_totallines_int
\fp_new:N \l_xwrapfig_adjfig_fp

\keys_define:nn { xwrapfig }
{
  cutout .code:n = {
    \keys_set:nn { xwrapfig / cutout } { #1 }
  }
}

\keys_define:nn { xwrapfig / cutout }
{
  hmargin .dim_set:N = \l_xwrapfig_adjwd_dim,
  hmargin .initial:n = { 2ex },
  skip~lines .int_set:N = \l_xwrapfig_adjlines_int,
  skip~lines .initial:n = { 1 },
  top~lines .int_set:N = \l_xwrapfig_toplines_int,
  top~lines .initial:n = { 2 },
}
\cs_generate_variant:Nn \galley_cutout_right:nn { nV }
\cs_generate_variant:Nn \galley_cutout_left:nn { nV }
\cs_new_protected:Nn \xwrapfig_prewrap:n
{
  \clist_clear:N \l_xwrapfig_indents_clist
  \clist_clear:N \l_xwrapfig_zindents_clist
  \vbox_set:Nn \l_xwrapfig_vfig_box { #1 }
  \dim_set:Nn \l_xwrapfig_totalht_dim { \box_ht:N \l_xwrapfig_vfig_box + \box_dp:N \l_xwrapfig_vfig_box }
  \hbox_set:Nn \l_xwrapfig_hfig_box { #1 }
  \dim_set:Nn \l_xwrapfig_wd_dim { \box_wd:N \l_xwrapfig_hfig_box + \l_xwrapfig_adjwd_dim }
  \int_set:Nn \l_xwrapfig_totallines_int { ( \l_xwrapfig_totalht_dim / \baselineskip ) + \l_xwrapfig_adjlines_int }
  \int_zero:N \l_xwrapfig_lines_int
  \int_do_while:nn { \l_xwrapfig_lines_int < \l_xwrapfig_totallines_int }
  {
    \int_incr:N \l_xwrapfig_lines_int
    \clist_put_right:Nn \l_xwrapfig_indents_clist { \l_xwrapfig_wd_dim }
  }
}
\cs_new_protected:Nn \xwrapfig_postwrap:
{
  \box_set_ht:Nn \l_xwrapfig_fig_box { 0pt }
  \box_set_dp:Nn \l_xwrapfig_fig_box { 0pt }
  \skip_vertical:n { -\baselineskip }
  \box_use:N \l_xwrapfig_fig_box
}
\cs_new_protected:Nn \xwrapfig_putright:nn
{
  \xwrapfig_prewrap:n { #2 }
  \galley_cutout_right:nV { #1 } \l_xwrapfig_indents_clist
  \vbox_set:Nn \l_xwrapfig_fig_box
  {
    \fp_set:Nn \l_xwrapfig_adjfig_fp { ( #1 + .5\l_xwrapfig_adjlines_int ) * \baselineskip }
    \skip_vertical:n  { \fp_to_dim:N \l_xwrapfig_adjfig_fp }
    \hbox_to_wd:nn { \linewidth } { \skip_horizontal:n { \linewidth - \l_xwrapfig_wd_dim + .5\l_xwrapfig_adjwd_dim } #2 }
  }
  \xwrapfig_postwrap:
}
\cs_new_protected:Nn \xwrapfig_putleft:nn
{
  \xwrapfig_prewrap:n { #2 }
  \galley_cutout_left:nV { #1 } \l_xwrapfig_indents_clist
  \vbox_set:Nn \l_xwrapfig_fig_box
  {
    \fp_set:Nn \l_xwrapfig_adjfig_fp { ( #1 + .5\l_xwrapfig_adjlines_int ) * \baselineskip }
    \skip_vertical:n  { \fp_to_dim:N \l_xwrapfig_adjfig_fp }
    \hbox_to_wd:nn { \l_xwrapfig_wd_dim } { \skip_horizontal:n { .5\l_xwrapfig_adjwd_dim } #2 }
  }
  \xwrapfig_postwrap:
}
\cs_generate_variant:Nn \xwrapfig_putleft:nn { Vn }
\cs_generate_variant:Nn \xwrapfig_putright:nn { Vn }
\NewDocumentCommand\putright { O { } +m }
{
  \keys_set:nn { xwrapfig / cutout } { #1 }
  \xwrapfig_putright:Vn \l_xwrapfig_toplines_int { #2 }
}
\NewDocumentCommand\putleft { O { } +m }
{
  \keys_set:nn { xwrapfig / cutout } { #1 }
  \xwrapfig_putleft:Vn \l_xwrapfig_toplines_int { #2 }
}
\NewDocumentCommand\resetindents { }
{
  \galley_parshape_set_multi:nnnN { 0 } { 0pt } { 0pt } \c_true_bool
}
\NewDocumentCommand\xwrapfigsetup { m }
{
  \keys_set:nn { xwrapfig } { #1 }
}
\ExplSyntaxOff


\begin{document}
  \kant[1]

  \putleft[top lines=3]{\includegraphics[width=.3\textwidth]{example-image-a}}
  \kant[3]

  \NewCoffin \ImgCoffin
  \SetVerticalCoffin\ImgCoffin{0.2\textwidth}{
    \includegraphics[scale=0.2]{example-image-a}
    \captionof*{figure}{ABCD}
  }

  \putright{
    \TypesetCoffin\ImgCoffin
  }
  \kant[5]

  \SetVerticalCoffin\ImgCoffin{0.4\textwidth}{
    \includegraphics[scale=0.4]{example-image-a}
    \captionof{figure}{ABCD}\label{fig-test}
  }

  In figure \ref{fig-test}:
  \putleft{
    \TypesetCoffin\ImgCoffin
  }

  \resetindents

  \xwrapfigsetup{%
    cutout={%
      skip lines=3,
      hmargin=5ex,
      top lines=1,
    }
  }

  \kant[7]

  \putright{\includegraphics[width=.3\textwidth]{example-image-a}}
  \kant[5]

\end{document}

以下是用wrapfig2结合xcoffins垂直盒子实现的带列表环境的图文混排,不知是不是合乎需求,如果是,则可能这个方案更为简洁。

\documentclass{ctexart}

\usepackage{xcoffins}
\usepackage{wrapfig2}
\usepackage{zhlipsum}

\begin{document}

\begin{wrapfigure}{r}{0.3\textwidth}
  \centering
  \includegraphics[scale=0.2]{example-image-a}
  \caption{示例图A}\label{fig:figure-a}
\end{wrapfigure}
\zhlipsum[1]

\NewCoffin \ImgCoffin
\SetVerticalCoffin\ImgCoffin{0.3\textwidth}{
  \begin{itemize}
    \item \LaTeX item A
    \item \LaTeX item B
    \item \LaTeX item C
  \end{itemize}
}

\begin{wrapfigure}{l}{0.4\textwidth}
  \centering
  \TypesetCoffin\ImgCoffin
  \caption{示例图B}\label{fig:figure-b}
\end{wrapfigure}
\zhlipsum[2]

\end{document}

image.png

还可以在原代码再添加captionlabel两个key,然后用coffin实现:

% https://tex.stackexchange.com/questions/309302/best-way-to-wrap-text-around-figures-in-expl3
\documentclass{article}

\usepackage{kantlipsum,tikz}

\usepackage{caption}
\usepackage{varwidth}
\usepackage{xcoffins}

\usepackage{xgalley}
\ExplSyntaxOn

\box_new:N    \l_xwrapfig_fig_box
\box_new:N    \l_xwrapfig_vfig_box
\box_new:N    \l_xwrapfig_hfig_box
\dim_new:N    \l_xwrapfig_wd_dim
\dim_new:N    \l_xwrapfig_totalht_dim
\clist_new:N  \l_xwrapfig_indents_clist
\int_new:N    \l_xwrapfig_lines_int
\int_new:N    \l_xwrapfig_totallines_int
\fp_new:N     \l_xwrapfig_adjfig_fp
\bool_new:N   \l_xwrapfig_caption_num_bool
\tl_new:N     \l_xwrapfig_caption_tl
\tl_new:N     \l_xwrapfig_label_tl
\coffin_new:N \l_xwrapfig_output_coffin

\keys_define:nn { xwrapfig }
  {
    cutout .code:n = {
      \keys_set:nn { xwrapfig / cutout } { #1 }
    }
  }

\keys_define:nn { xwrapfig / cutout }
  {
    hmargin .dim_set:N = \l_xwrapfig_adjwd_dim,
    hmargin .initial:n = { 2ex },
    skip~lines .int_set:N = \l_xwrapfig_adjlines_int,
    skip~lines .initial:n = { 1 },
    top~lines .int_set:N = \l_xwrapfig_toplines_int,
    top~lines .initial:n = { 2 },
    caption .tl_set:N = \l_xwrapfig_caption_tl,
    caption .initial:n = {},
    label .tl_set:N = \l_xwrapfig_label_tl,
    label .initial:n = {},
  }

\cs_generate_variant:Nn \galley_cutout_right:nn { nV }
\cs_generate_variant:Nn \galley_cutout_left:nn { nV }

\cs_new_protected:Nn \xwrapfig_prewrap:n
  {
    \clist_clear:N \l_xwrapfig_indents_clist
    \clist_clear:N \l_xwrapfig_zindents_clist

    \vbox_set:Nn \l_xwrapfig_vfig_box
      {
        \tl_if_empty:VTF \l_xwrapfig_caption_tl
          {
            #1
          }{
            #1
            \captionof*{figure}{\l_xwrapfig_caption_tl}
          }
      }
    \dim_set:Nn  \l_xwrapfig_totalht_dim
      { \box_ht:N \l_xwrapfig_vfig_box + \box_dp:N \l_xwrapfig_vfig_box }

    \hbox_set:Nn \l_xwrapfig_hfig_box { #1 }
    \dim_set:Nn \l_xwrapfig_wd_dim
      { \box_wd:N \l_xwrapfig_hfig_box + \l_xwrapfig_adjwd_dim }

    \vcoffin_set:Nnn \l_xwrapfig_output_coffin { \l_xwrapfig_wd_dim }
      {
        \centering
        \bool_if:NTF \l_xwrapfig_caption_num_bool
          {
            \tl_if_empty:VTF \l_xwrapfig_caption_tl
              {
                #1
              }{
                #1
                \captionof{figure}{\l_xwrapfig_caption_tl}
                \tl_if_empty:VF \l_xwrapfig_label_tl
                  {
                    \label{\l_xwrapfig_label_tl}
                  }
              }
          }{
            \tl_if_empty:VTF \l_xwrapfig_caption_tl
              {
                #1
              }{
                #1
                \captionof*{figure}{\l_xwrapfig_caption_tl}
              }
          }
      }
    \tl_clear:N \l_xwrapfig_caption_tl
    \tl_clear:N \l_xwrapfig_label_tl

    \int_set:Nn \l_xwrapfig_totallines_int
      { ( \l_xwrapfig_totalht_dim / \baselineskip ) + \l_xwrapfig_adjlines_int }

    \int_zero:N \l_xwrapfig_lines_int
    \int_do_while:nn { \l_xwrapfig_lines_int < \l_xwrapfig_totallines_int }
      {
        \int_incr:N \l_xwrapfig_lines_int
        \clist_put_right:Nn \l_xwrapfig_indents_clist { \l_xwrapfig_wd_dim }
      }
  }

\cs_new_protected:Nn \xwrapfig_postwrap:
  {
    \box_set_ht:Nn \l_xwrapfig_fig_box { 0pt }
    \box_set_dp:Nn \l_xwrapfig_fig_box { 0pt }

    \skip_vertical:n { -\baselineskip }

    \box_use:N \l_xwrapfig_fig_box
  }

\cs_new_protected:Nn \xwrapfig_putright:nn
  {
    \xwrapfig_prewrap:n { #2 }

    \galley_cutout_right:nV { #1 } \l_xwrapfig_indents_clist

    \vbox_set:Nn \l_xwrapfig_fig_box
    {
      \fp_set:Nn \l_xwrapfig_adjfig_fp
        { ( #1 + .5\l_xwrapfig_adjlines_int ) * \baselineskip }

      \skip_vertical:n  { \fp_to_dim:N \l_xwrapfig_adjfig_fp }

      \hbox_to_wd:nn { \linewidth }
        {
          \skip_horizontal:n { \linewidth - \l_xwrapfig_wd_dim
                               + .5\l_xwrapfig_adjwd_dim }
          \coffin_typeset:Nnnnn \l_xwrapfig_output_coffin
            {l} {vc} {0pt} {0pt}
          % #2
        }
    }

    \xwrapfig_postwrap:
  }

\cs_new_protected:Nn \xwrapfig_putleft:nn
  {
    \xwrapfig_prewrap:n { #2 }

    \galley_cutout_left:nV { #1 } \l_xwrapfig_indents_clist

    \vbox_set:Nn \l_xwrapfig_fig_box
      {
        \fp_set:Nn \l_xwrapfig_adjfig_fp
          { ( #1 + .5\l_xwrapfig_adjlines_int ) * \baselineskip }

        \skip_vertical:n { \fp_to_dim:N \l_xwrapfig_adjfig_fp }

        \hbox_to_wd:nn { \l_xwrapfig_wd_dim }
          {
            % \skip_horizontal:n { .5\l_xwrapfig_adjwd_dim }
            \coffin_typeset:Nnnnn \l_xwrapfig_output_coffin
              {l} {vc} {0pt} {0pt}
            % #2
          }
      }
      \xwrapfig_postwrap:
  }
\cs_generate_variant:Nn \xwrapfig_putleft:nn { Vn }
\cs_generate_variant:Nn \xwrapfig_putright:nn { Vn }

\NewDocumentCommand\putright { s O { } +m }
  {
    \IfBooleanTF{#1}
      {
        \bool_set_false:N \l_xwrapfig_caption_num_bool
      }{
        \bool_set_true:N  \l_xwrapfig_caption_num_bool
      }
    \keys_set:nn { xwrapfig / cutout } { #2 }
    \xwrapfig_putright:Vn \l_xwrapfig_toplines_int { #3 }
  }
\NewDocumentCommand\putleft { s O { } +m }
  {
    \IfBooleanTF{#1}
      {
        \bool_set_false:N \l_xwrapfig_caption_num_bool
      }{
        \bool_set_true:N  \l_xwrapfig_caption_num_bool
      }
    \keys_set:nn { xwrapfig / cutout } { #2 }
    \xwrapfig_putleft:Vn \l_xwrapfig_toplines_int { #3 }
  }
\NewDocumentCommand\resetindents { }
  {
    \galley_parshape_set_multi:nnnN { 0 } { 0pt } { 0pt } \c_true_bool
  }
\NewDocumentCommand\xwrapfigsetup { m }
  {
    \keys_set:nn { xwrapfig } { #1 }
  }
\ExplSyntaxOff


\begin{document}
  \kant[1]

  \putleft[top lines=3]{\includegraphics[width=.3\textwidth]{example-image-a}}
  \kant[3]

  \putright[caption=ABCD,label=fig-abcd]
  {
    \includegraphics[scale=0.2]{example-image-a}
  }
  \kant[5]

  \resetindents

  \xwrapfigsetup{%
    cutout={%
      skip lines=3,
      hmargin=5ex,
      top lines=1,
    }
  }

  \putright{\includegraphics[width=.3\textwidth]{example-image-a}}
  \kant[1]

  \putleft*[caption=EFGH,label=fig-efgh]
  {
    \includegraphics[scale=0.3]{example-image-a}
  }
  \kant[5]

  \kant[7]

  In figure \ref{fig-kkkk}:

  \xwrapfigsetup{%
    cutout={%
      skip lines=1,
      hmargin=2ex,
      top lines=3,
    }
  }
  \putleft[caption=KKKK,label=fig-kkkk]
  {
    \includegraphics[scale=0.3]{example-image-a}
  }
  \kant[5]

\end{document}

这是做广告吧,一般正文不会用这么大的字吧。

字不多的话,塞到盒子里放大,也是一个办法。还可以进行旋转、错切等变换。

也可以用LaTeX3切出单个字,然后进行单独处理。

参考关于多行文字分散对齐的CJKfilltwosides环境的提问中的回答,这个也可以用LaTeX3结合coffin利用拼接实现:

\documentclass{ctexart}

\usepackage{expl3}
\usepackage{xparse}

\ExplSyntaxOn
% 获取文本长度函数,#1用于保存长度,#2是被检测的文字
\cs_new:Npn \l_get_text_width:Nn #1#2
  {
    % 将文字内容存入变量
    \hbox_set:Nn \l_tmpa_box {\l_font_tl #2}
    % 用\box_wd:N函数获取盒子宽度,并存入长度变量
    \dim_set:Nn #1 { \box_wd:N \l_tmpa_box }
  }
% 文本长度函数变体
\cs_generate_variant:Nn \l_get_text_width:Nn { NV }

\dim_new:N \l_h_sep_dim
\dim_new:N \l_v_sep_dim

\dim_new:N \l_hang_wd_dim
\dim_new:N \l_text_wd_dim

\coffin_new:N \l_output_coffin
% \coffin_new:N \l_content_text_coffin

\tl_new:N \l_font_tl

\keys_define:nn { hangindent }
  {
    hsep .dim_set:N = \l_h_sep_dim,
    hsep .initial:n = 0pt,

    vsep .dim_set:N = \l_v_sep_dim,
    vsep .initial:n = 0pt,

    font .tl_set:N = \l_font_tl,
    font .initial:n = \normalsize,

    unknown .code:n = { \__hangindent_error:n { unknown-option } }
  }
\msg_new:nnn { hangindent } { unknown-option }
  { package~ option~ "\l_keys_key_tl"~ is~ unknown. }

\NewDocumentCommand \hangset { m }
  { \keys_set:nn { hangindent } {#1} }

% 居中对齐盒子函数
\cs_new_protected:Npn \__hang_indent:nn #1#2
{
  % 计算悬挂文字宽度
  \l_get_text_width:Nn \l_hang_wd_dim { #1 }

  % 计算文本剩余宽度
  \dim_set:Nn \l_text_wd_dim { \textwidth - \l_hang_wd_dim - \parindent - \l_h_sep_dim }

  % 设置悬挂容器
  \hcoffin_set:Nn \l_output_coffin {\l_font_tl #1}
  % 设置文本容器
  \vcoffin_set:Nnn \l_tmpa_coffin {\l_text_wd_dim} {\noindent #2 }

  % 将文本容器拼接到输出结果容器
  \coffin_join:NnnNnnnn \l_output_coffin { r } { t }
      \l_tmpa_coffin { l } { t }  { \l_h_sep_dim } { \l_v_sep_dim }

  % 输出结果容器
  \coffin_typeset:Nnnnn \l_output_coffin { l } { t } { 0pt } { 0pt }
}

% 定义用户接口
\NewDocumentCommand{\hang}{O{} m m}
  {
    \group_begin:
      \keys_set:nn { hangindent } {#1}
      \__hang_indent:nn {#2}{#3}
    \group_end:
  }
\ExplSyntaxOff

\begin{document}

第一段文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字
文字文字文字

% 默认参数
\hang{第二段}{文字字文字文字文字文字文字文字文字文字文字文字文字文字文字文
              字文字文字文字文字文字字文字文字文字文字文字文字文字文字文字
              文字文字文字文字文字文字文字文字文字文字}

\bigskip

% 可以用hsep指定悬挂文字与内容间的的水平距离
% 可以用vsep指定悬挂文字与内容间的的垂直偏移距离
\hang[hsep=5pt, vsep=15pt]{第二段}{文字字文字文字文字文字文字文字文字文字文
             字文字文字文字文字文字文字文字文字文字文字字文字文字文字文字文
             字文字文字文字文字文字文字文字文字文字文字文字文字文字文字}

\bigskip

% 也可以用font设置悬挂文字的字体参数
\hang[font=\Large\heiti\bfseries]{第二段}{文字字文字文字文字文字文字文字文字
            文字文字文字文字文字文字文字文字文字文字文字文字字文字文字文字文
            字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字}

\bigskip

\begin{minipage}{0.5\textwidth}
% 也可以用font设置悬挂文字的字体参数
\hang[font=\Large\heiti\bfseries]{第二段}{文字字文字文字文字文字文字文字文字
            文字文字文字文字文字文字文字文字文字文字文字文字字文字文字文字文
            字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字}
\end{minipage}
\end{document}

image.png

我也来凑个热闹,参照用LaTeX3排版分散和居中对齐文字用LaTeX3实现这一需求:

\documentclass{ctexart}

\usepackage{expl3}
\usepackage{xparse}

\ExplSyntaxOn
% 获取文本长度函数,#1用于保存长度,#2是被检测的文字
\cs_new:Npn \l_get_text_width:Nn #1#2
  {
    % 将文字内容存入变量
    \hbox_set:Nn \l_tmpa_box {\l_font_tl #2}
    % 用\box_wd:N函数获取盒子宽度,并存入长度变量
    \dim_set:Nn #1 { \box_wd:N \l_tmpa_box }
  }
% 文本长度函数变体
\cs_generate_variant:Nn \l_get_text_width:Nn { NV }

% 获取clist中各个成员长度是大值,
% #1用于保存长度变量,#2是被检测clist变量
\cs_new:Npn \l_get_max_text_width:NN #1#2
  {
    \group_begin:
      % 将长度设置为小值
      \dim_set:Nn #1 {-999pt}
      \clist_set_eq:NN \l_tmpa_clist #2
      % 循环检测每个tl的长度,并更新是大值
      \bool_until_do:nn { \clist_if_empty_p:N \l_tmpa_clist }
        {
          \clist_pop:NN \l_tmpa_clist \l_tmpa_tl
          \l_get_text_width:NV \l_tmpa_dim \l_tmpa_tl
          \dim_gset:Nn #1 { \dim_max:nn {#1} { \l_tmpa_dim } }
        }
    \group_end:
  }

% 分散对齐盒子,
% #1是盒子长度变量,#2是需要排版的文字
\cs_new_protected:Npn \l_spread_box:nn #1#2
  {
    \mode_leave_vertical:
    \hbox_to_wd:nn {#1}
      { \tl_map_inline:xn {#2} { ##1 \hfil } \unskip }
  }
% 分散对齐盒子函数变体
\cs_generate_variant:Nn \l_spread_box:nn  { Vn }
\cs_generate_variant:Nn \l_spread_box:nn  { nV }

% 居中对齐盒子,
% #1是盒子长度变量,#2是需要排版的文字
\cs_new_protected:Npn \l_center_box:nn #1#2
  {
    \mode_leave_vertical:
    \dim_set:Nn \l_tmpa_dim {#1}
    \dim_add:Nn \l_tmpa_dim {0.6em}
    \makebox[0cm][l]{\rule[-0.5ex]{\l_tmpa_dim}{0.4 pt}}
      {\hbox_to_wd:nn {\l_tmpa_dim} { \hfil #2 \hfil }}
  }
% 居中对齐盒子函数变体
\cs_generate_variant:Nn \l_center_box:nn { Vn }

% 为文字添加下划线
\cs_new:Npn \l_text_uline:n #1
  {
    \l_get_text_width:Nn \l_tmpa_dim {#1}
    \dim_add:Nn \l_tmpa_dim {0.6em}
    % 将标尺盒子放到宽度为0的左右盒子中实现下划线
    \makebox[0pc][l]{\rule[-0.5ex]{\l_tmpa_dim}{0.4 pt}}
      % 用高度为0的标尺盒子在文字两端添加空白
      \rule{.3em}{0cm}#1\rule{.3em}{0cm}
  }

\clist_new:N \l_schools_clist

\dim_new:N \l_h_sep_dim
\dim_new:N \l_v_sep_dim

\coffin_new:N \l_output_coffin
\coffin_new:N \l_school_coffin

\tl_new:N \l_font_tl

\keys_define:nn { examinfo }
  {
    hsep .dim_set:N = \l_h_sep_dim,
    hsep .initial:n = 5pt,

    vsep .dim_set:N = \l_v_sep_dim,
    vsep .initial:n = 5pt,

    font .tl_set:N = \l_font_tl,
    font .initial:n = \normalsize,

    unknown .code:n = { \__examinfo_error:n { unknown-option } }
  }
\msg_new:nnn { examinfo } { unknown-option }
  { package~ option~ "\l_keys_key_tl"~ is~ unknown. }

\NewDocumentCommand \examinfoset { m }
  { \keys_set:nn { examinfo } {#1} }

% 居中对齐盒子函数
\cs_new_protected:Npn \__examinfo_cover:nnn #1#2#3
{
  \clist_set:Nn \l_schools_clist{#2}

  % 设置年度容器
  \hcoffin_set:Nn \l_tmpa_coffin {\l_font_tl #1}
  \hcoffin_set:Nn \l_tmpb_coffin {\l_font_tl #3}

  % 计算校名最大长度
  \l_get_max_text_width:NN \l_tmpa_dim \l_schools_clist

  % 排版第一个校名
  \clist_if_empty:NF \l_schools_clist
    {
      % 从左端弹出一个校名
      \clist_pop:NN \l_schools_clist \l_tmpa_tl
      % 设置输出结果容器内容
      \hcoffin_set:Nn \l_output_coffin
        {
          % 排版分散对齐盒子
          \tl_use:N \l_font_tl
          \l_spread_box:Vn \l_tmpa_dim { \l_tmpa_tl }
        }
    }
  % 排版其它校名
  \bool_until_do:nn { \clist_if_empty_p:N \l_schools_clist }
    {
      % 从左端弹出一个校名
      \clist_pop:NN \l_schools_clist \l_tmpa_tl
      % 设置校名容器内容
      \hcoffin_set:Nn \l_school_coffin
        {
          % 排版分散对齐盒子
          \tl_use:N \l_font_tl
          \l_spread_box:Vn \l_tmpa_dim { \l_tmpa_tl }
        }
      % 将校名容器拼接到输出结果窗口(按\l_v_sep_dim为间隔拼接)
      \coffin_join:NnnNnnnn \l_output_coffin { hc } { b }
        \l_school_coffin { hc } { t }  { 0pt } { -\l_v_sep_dim }
    }

  % 将年度容器拼接到输出结果容器(按\l_h_sep_dim为间隔拼接)
  \coffin_join:NnnNnnnn \l_output_coffin { vc } { l }
      \l_tmpa_coffin { vc } { r }  { -\l_h_sep_dim } { 0pt }
  % 将试卷名称容器拼接到输出结果容器(按\l_h_sep_dim为间隔拼接)
  \coffin_join:NnnNnnnn \l_output_coffin { vc } { r }
      \l_tmpb_coffin { vc } { l }  { \l_h_sep_dim } { 0pt }

  % 输出结果容器
  \coffin_typeset:Nnnnn \l_output_coffin { vc } { l } { 0pt } { 0pt }
}

% 定义用户接口
\NewDocumentCommand{\examinfo}{O{} m m m}
  {
    \group_begin:
      \keys_set:nn { examinfo } {#1}
      \__examinfo_cover:nnn {#2}{#3}{#4}
    \group_end:
  }
\ExplSyntaxOff


\begin{document}

\section{默认参数}
% 注意校名间用英文逗号分隔
\examinfo{2021年}{哈尔滨师大附中, 东北师大附中, 辽宁省实验中学}{高三第一次联考}

\bigskip

\section{指定间距}
% 可以用hsep指定年度、校名、考试名称间的水平距离
% 可以用vsep指定校名间的垂直距离\bfseries
\examinfo[hsep=1cm, vsep=15pt]{2022年}{金华市, 衢州市}{初三第一次联考}

\bigskip

\section{指定字体}
% 也可以用font设置字体参数
\examinfo[font=\Large\heiti\bfseries]{2022年}{金华市, 衢州市}{初三第一次联考}

\end{document}

image.png

给MWE,没有代码,猜不到

Windows的字体,删除字体调用指定,不用它就是了,用默认的。

可以用nicematrix宏包结合TikZ绘图实现:

\documentclass{ctexart}

\usepackage{tikz}
\usepackage{nicematrix}

\begin{document}
\small
\NiceMatrixOptions{cell-space-top-limit=3pt}
$\begin{NiceArray}{*{9}{c}}[corners,hvlines]
\CodeBefore
  \begin{tikzpicture}
    \draw [fill=gray!35] (6-|1) |- (5-|2) |- (4-|3) |- (3-|4) |-
                         (2-|5) |- (3-|4) |- (4-|3) |- (5-|2) |- cycle ;
    \draw [fill=gray!35] (6-|5) |- (5-|6) |- (4-|7) |- (3-|8) |-
                         (2-|9) |- (3-|8) |- (4-|7) |- (5-|6) |- cycle ;
  \end{tikzpicture}
\Body
& & & & & & & &  \\
& & & I_1 & I_2 & I_3 & I_4 & I_5 & \\
& & I_1 & I_2 & I_3 & I_4 & I_5  \\
& I_1 & I_2 & I_3 & I_4 & I_5  \\
I_1 & I_2 & I_3 & I_4 & I_5  \\
\CodeAfter
  \begin{tikzpicture}
    \draw [->] (6-|1) -- (1-|1);
    \draw [->] (6-|1) -- (6-|last);
    \draw [dashed] (2-|1) -- (2-|4);
    \draw [dashed] (3-|1) -- (3-|3);
    \draw [dashed] (4-|1) -- (4-|2);
    \draw [dashed] (5-|7) -- (6-|7);
    \draw [dashed] (4-|8) -- (6-|8);
    \draw [dashed] (3-|9) -- (6-|9);
    \draw [->] (2-|5) -- (1-|5);
    \draw [->] (2-|6) -- (1-|6);
    \draw [->] (2-|7) -- (1-|7);
    \draw [->] (2-|8) -- (1-|8);
    \foreach \t [count=\i from 1] in {0,...,8}
    {
      \node[yshift=-6pt] at (6-|\i) {\small$t_{\t}$};
    }
    \node[yshift=-6pt] at (6-|10) {\small$t$};
    \foreach \p [count=\i from 2] in {{取指令},{译\hspace{\ccwd}码},
                                      {执\hspace{\ccwd}行},{存结果}}
    {
      \node[xshift=-18pt] at (\i-|1) {\small\p};
    }
    \node[xshift=-5pt] at (1-|1) {\small$s$};
    \draw [red ] (6-|1) |- (5-|2) |- (4-|3) |- (3-|4) |-
                 (2-|5) |- (3-|4) |- (4-|3) |- (5-|2) |- cycle ;
    \draw [cyan] (6-|2) |- (5-|3) |- (4-|4) |- (3-|5) |-
                 (2-|6) |- (3-|5) |- (4-|4) |- (5-|3) |- cycle ;
  \end{tikzpicture}
\end{NiceArray}$

\end{document}

其排版结果为:
2021-11-12_07-48.png

说明,需要多次编译才能正确绘制。

多加一列,将除第一行之外剩余行合并即可:

\documentclass[13pt]{article}
\usepackage{geometry}
\geometry{a4paper,left=2cm,right=2cm,top=2.5cm,bottom=2.5cm} 
\usepackage{ctex}
\usepackage{tabularray}

\begin{document}
  \noindent
  \begin{tblr}{vlines,hlines,
      colspec={X[1]X[2]X[2]X[2]X[4]X[4]},
      colspec={Q[c,m]Q[l,m]Q[c]Q[c]Q[l,m]Q[l,m]},
      cell{2-Z}{3}={c=2}{c},
      row{1}=}

    &&&&&\\

    &&&&&\\

    &&&&&\\

    &&&&&\\

    &&&&&\\

    &&&&&\\

    \end{tblr}

\end{document}

排版结果为:
2021-11-11_20-03.png

复制的源码大概念跑不能,因为没有其它需要的文件。应该是下载,把所有的相关文件都下载了才是正确的。

这问题几乎没有任何有用信息,建议把问题组织好再问。

另,LaTeX是跨平台的,理论上咋换都不影响,可能还是代码写的有问题。

common/theme.sty中:
第372-376行和第461-467行的代码中,将%[plain]注释取消,如:

...
\AtBeginSection[]{%
  \begin{frame}[plain]
    \sectionpage
  \end{frame}%
}
...
\AtBeginSubsection{%
  \begin{frame}[plain]
    \setlength{\parskip}{0pt}%
    \offinterlineskip
    \subsectionpage
  \end{frame}%
}
...

另外,注意在gdsx01-02.tex的导言区应该避免使用绝对路径,强烈建议将:

\input{C:/Users/hp/Desktop/gdsx/common/theme.sty}
\input{C:/Users/hp/Desktop/gdsx/common/share.sty}
\input{C:/Users/hp/Desktop/gdsx/common/local.sty}

改为:

\input{common/theme.sty}
\input{common/share.sty}
\input{common/local.sty}

否则,更换计算机或操作系统后,极大概率无法编译!

发布
问题