30 关于悬挂缩进的一个土方法,请各位大佬不要嫌弃

发布于 2022-02-10 18:38:13

我写一段代码,用土办法实现了悬挂缩进

\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}之前的文字宽度

查看更多

关注者
0
被浏览
1.1k
3 个回答
zepinglee
zepinglee 2022-02-11
这家伙很懒,什么也没写!

“注意事项:”以及悬挂缩进的宽度是固定的吗?

行者
行者 2022-02-12
这家伙很懒,什么也没写!
\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}

运行效果如下:

image.png

Saino
Saino 2022-08-17
这家伙很懒,什么也没写!
\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}

image.png

https://ask.latexstudio.net/ask/question/7232.html 的方案改变而来,基本算是比较完美了。
目前问题是不兼容lineno以及wrapstuff宏包,lineno适配倒是不难,但是很繁琐,等有时间再弄弄。
以及 lualatex 无效,原因待查证。

撰写答案

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

发布
问题

分享
好友

手机
浏览

扫码手机浏览