各位大佬,工作室曾经有一个关于悬挂缩进的作品,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}
有三个问题请各位大佬解决,(1)hang前后的段落间距行距不一致,如何保证正常的段间距?(2)能否改进代码,利用linegoal宏包自动测量剩余文本的宽度,实现这样的代码输入:
第二段\hang{文字……}
(3)能否改进代码,实现嵌套?即实现这样的代码输入:
第二段\hang{文字……\\
嵌套子段\hang{文字……}}
(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}
(3) 不能用这种方法。
请问大佬,上面提到的(3),即嵌套,除了列表环境,还有没有其他替代方案?
@u7483 将对应点的绝对位置(坐标)写入 label,第二次编译时文字的宽度就使用这些 label 的值。
@u10307 大佬,能否给出一个简要的代码,我领悟水平比较低?