10 关于工作室一个悬挂缩进作品的问题

发布于 2022-03-09 15:28:16

各位大佬,工作室曾经有一个关于悬挂缩进的作品,https://www.latexstudio.net/index/details/index/mid/2361.html
我测试后的效果如下

\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{第二段}{文字字文字文字文字文字文字文字文字文字文字文字文字文字文字文
              字文字文字文字文字文字字文字文字文字文字文字文字文字文字文字
              文字文字文字文字文字文字文字文字文字文字
}

文字字文字文字文字文字文字文字文字文字文字文字文字文字文字文
              字文字文字文字文字文字字文字文字文字文字文字文字文字文字文字
              文字文字文字文字文字文字文字文字文字

\end{document}

e8a765a856d611bf995c81b988a72a6.jpg
有三个问题请各位大佬解决,(1)hang前后的段落间距行距不一致,如何保证正常的段间距?(2)能否改进代码,利用linegoal宏包自动测量剩余文本的宽度,实现这样的代码输入:

    第二段\hang{文字……}

(3)能否改进代码,实现嵌套?即实现这样的代码输入:

    第二段\hang{文字……\\
               嵌套子段\hang{文字……}}

查看更多

关注者
0
被浏览
933
1 个回答
雾月
雾月 2022-03-10
这家伙很懒,什么也没写!

(1)、(2)

\documentclass{ctexart}
\usepackage{linegoal}

\makeatletter
\def\suppskip{\vskip\baselineskip \vskip-\f@size\p@\relax}
\makeatother

\begin{document}

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

第二段\begin{minipage}[t]{\linegoal}
文字字文字文字文字文字文字文字文字文字文字文字文字文字文字文
字文字文字文字文字文字字文字文字文字文字文字文字文字文字文字
文字文字文字文字文字文字文字文字文字文字
\end{minipage}\suppskip

文字字文字文字文字字文字文字文字字文字文字文字字文字文字文字字文字文字
文字字文字文字文字字文字文字文字字文字文字文字字文字文字文字字文字文字

\end{document}

image.png

(3) 不能用这种方法。

撰写答案

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

发布
问题

分享
好友

手机
浏览

扫码手机浏览