目前实现悬挂缩进的主要方法有两个,一个是hangafter配合 hangindent ;另一个是列表环境。下面的代码hangafter配合 hangindent 实现的悬挂缩进。
\documentclass{ctexart}
\begin{document}
第一段文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字
\hangafter 1
\hangindent 5em
第二段文字字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字
\end{document}
我的问题是,假如不用列表环境,也不用hangindent,能否做一个更好的代码,随时随地实现悬挂缩进?比如,“第二段”这三个字之后紧跟一条命令,让这条命令内的文本实现悬挂缩进。
是这个效果么?
\documentclass{ctexart}
\usepackage{linegoal}
\newlength\goalindent
\newcommand\hindentpar[1]{%
\setlength\goalindent{\dimexpr\linewidth-\linegoal\relax}%
\hangindent\goalindent%
#1}
\begin{document}
劳仑衣普桑,认至将指点效则机,最你更枝。想极整月正进好志次回总般,段然取向使张规军证回,世市总李率英茄持伴。
第二段:\hindentpar{水厂共当而面三张,白家决空给意层般,单重总歼者新。每建马先口住月大,究平克满现易手,省否何安苏京。两今此叫证程事元七调联派业你,全它精据间属医拒严力步青。}
\noindent
这回开始不缩进写第三段:\hindentpar{她己道按收面学上全始,形万然许压己金史好,力住记赤则引秧。处高方据近学级素专,者往构支明系状委起查,增子束孤不般前。}
你要的是这个效果么?
\end{document}
参考关于多行文字分散对齐的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}
用@u1077 的例子
\documentclass{ctexart}
\makeatletter
\let\hangfrom\@hangfrom
\makeatother
\begin{document}
劳仑衣普桑,认至将指点效则机,最你更枝。想极整月正进好志次回总般,段然取向使张规军证回,世市总李率英茄持伴。
\hangfrom{第二段:}水厂共当而面三张,白家决空给意层般,单重总歼者新。每建马先口住月大,究平克满现易手,省否何安苏京。两今此叫证程事元七调联派业你,全它精据间属医拒严力步青。
\noindent
\hangfrom{这回开始不缩进写第三段:}她己道按收面学上全始,形万然许压己金史好,力住记赤则引秧。处高方据近学级素专,者往构支明系状委起查,增子束孤不般前。
你要的是这个效果么?
\end{document}
正是这个效果!感谢大佬!
大佬你好,你定义的hindentpar能否嵌套使用?要是可以嵌套那就更强了!