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

注册于 4年前

回答
170
文章
5
关注者
17

参考关于多行文字分散对齐的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}

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

-shell-escape--shell-escape没有区别,不过个人认为对于长参数使用--shell-escape更为明确。注意,不是—-shell-escape,前面是两个-(减号)。

是不是应该在表格结束后,再用\catcode`\%=14转回来呢?否则后续可能无法注释。

发布
问题