我写一段代码,用土办法实现了悬挂缩进
\documentclass{ctexart}
\usepackage{indentfirst}
\setlength{\parindent}{0em}
\usepackage{zhlipsum}
\newlength\biaoqian
\newenvironment{hangup}[1][]
{\settowidth\biaoqian{#1}\hspace{-\biaoqian}\leftskip=\biaoqian#1
}
{\par}
\begin{document}
\begin{hangup}[注意事项:]
\zhlipsum[1]
\end{hangup}
\end{document}
它的效果见附件13t.pdf
我的问题是,能否再优化一下代码,使得正文区域只要输入形如下面的代码就可以实现附件中的悬挂效果?
注意事项:\begin{hangup}\zhlipsum[1] \end{hangup}
难点就在于测量“注意事项:”的宽度,然后再利用这个宽度,也就是如何自动测量begin{hangup}之前的文字宽度
\documentclass{ctexart}
\usepackage{linegoal}
\usepackage{zhlipsum}
\setlength{\parindent}{0em}
\newenvironment{hangup}
{\hangindent=\dimexpr\linewidth-\linegoal}%
{}
\begin{document}
注意事项:
\begin{hangup}%
\zhlipsum[1]
\end{hangup}
\end{document}
运行效果如下:
\documentclass{article}
\usepackage{linegoal}
\usepackage{lipsum}
%\usepackage{lineno}
\usepackage{wrapfig}
\makeatletter
\newdimen\savegoal
\newdimen\saveprevdepth
\newcount\saveprevgraf
\newcount\savepenalty
\newtoks\saveoutput
\newbox\linebox
\newskip\saveskip
\expandafter\let\expandafter\@@output\csname tex_output:D\endcsname
%\let\@@output=\output
%\newif\ifendswithglue
\def\play{%
\global\@@output=\expandafter{\the\saveoutput}%
\ifnum\outputpenalty=-1000000
\setbox\z@\vbox{\unvbox\@cclv\processlastline}%
\unvbox\z@
\aftergroup\replay
\else
\the\saveoutput
\global\@@output={\play}%
\fi
}
\def\processlastline{%
\global\setbox\linebox=\lastbox
\ifvoid\linebox\else
\unskip
\ifnum\saveprevgraf=1
% \parskip and \lineskip
\unskip
\else
\savepenalty=\lastpenalty
\unpenalty
\penalty\numexpr\savepenalty-\widowpenalty\relax
\nobreak\vskip-\parskip
\fi
\fi
}
\def\replay{%
\ifvoid\linebox\else
\noindent
\prevgraf=\numexpr\saveprevgraf-1\relax
\setbox\linebox=\hbox{\hskip-\leftskip
\unhbox\linebox
% \par's \unskip \penalty10000 \hskip\parfillskip and \rightskip
\unskip\unskip\unpenalty
% \ifendswithglue
% \hskip\saveskip
% \fi
}%
\hskip-\dimexpr\linewidth-\savegoal-\leftskip\relax
\leftskip=\glueexpr\leftskip-\dimexpr\leftskip\relax+\linewidth-\savegoal\relax
\unhbox\linebox
\fi}
\def\hanghere{%
\savegoal=\linegoal
%% \linegoal generates a whatsit, so the skip is not removed by \par
% \ifnum\lastnodetype=11
% \endswithgluetrue
% \saveskip\lastskip
% \else
% \endswithgluefalse
% \fi
\endgraf
\saveprevgraf=\prevgraf
\saveoutput=\expandafter{\the\@@output}%
\@@output={\play}%
\penalty-1000000
\ignorespaces
\parindent=0pt
}
\def\endhanghere{\par}
\makeatother
\begin{document}
\begin{wrapfigure}[12]{r}[34pt]{5cm} 〈figure〉 \end{wrapfigure}
\lipsum[1]
\begin{hanghere}
\lipsum[2]
\begin{hanghere}
\lipsum[3]
\end{hanghere}
\end{hanghere}
\end{document}
从 https://ask.latexstudio.net/ask/question/7232.html 的方案改变而来,基本算是比较完美了。
目前问题是不兼容lineno
以及wrapstuff
宏包,lineno
适配倒是不难,但是很繁琐,等有时间再弄弄。
以及 lualatex 无效,原因待查证。
不是固定的,难点就在于测量“注意事项:”的宽度,然后再利用这个宽度,也就是如何自动测量begin{hangup}之前的文字宽度