parbox 周围的垂直间距

parbox 周围的垂直间距

鉴于这种:

\documentclass{article}
\usepackage{lipsum}
\usepackage{setspace}
\setstretch{1.5}
\setlength{\parindent}{0pt}

\newlength{\len}
\newcommand{\arrowed}[1]{%
  % draw an arrow, then a parbox that's exactly
  % the remaining width of the line
  \settowidth{\len}{$\rightarrow$}%
  \addtolength{\len}{-2\len}%
  \addtolength{\len}{\textwidth}%
  $\rightarrow$\parbox[t]{\len}{#1}%
}

\begin{document}
\lipsum[2]
\arrowed{\lipsum[4]}
\lipsum[6]
\arrowed{But this is OK, since it's only one line.}
\lipsum[2]
\end{document}

除紧接在大 parbox 之后的部分外,它是双倍行距的。我该如何修复它?

(我知道还有其他方法可以达到与我在这里所做的相同的结果,但它是使用列表项标签中的 parbox 的其他内容的一部分,而我遇到的问题是,如果内容超过一行,则 parbox 后的间距是错误的。)


编辑:

感谢您的建议。下面是一些更完整的代码,展示了我如何使用 parbox 作为列表项标签的一部分,如前所述。我已尝试采纳您的建议:@Werner 的建议(标记为1在代码中)给出You can't use \prevdepth in restricted horizontal mode,而@Steven的建议(标记为[2])似乎没有任何效果。我尝试了其中的一些变体,但没有任何效果。

\documentclass{article}
\usepackage{setspace,lipsum}
\makeatletter
\newcommand\singlelipsum[1]{%
  \begingroup\let\lips@par\relax\csname lipsum@\@roman{#1}\endcsname
\endgroup }
\newlength{\argwidth}
\newcommand{\argparams}[1]{%
  \parbox[t]{\argwidth}{%
    \setstretch{1.5}%
    #1)%
    %\par\xdef\tpd{\the\prevdepth}%  [1]
    %\strut%  [2]
  }%
  %\par\prevdepth\tpd%  [1]
  %\\\strut\ignorespaces%   [2]
}
\newcommand{\argfunc}[1]{\textbf{#1}(}
\newcommand{\argitem}[2]{
  \settowidth{\argwidth}{\argfunc{#1}}%
  \addtolength{\argwidth}{-2\argwidth}%
  \addtolength{\argwidth}{\textwidth}%
  \item[\argfunc{#1}\argparams{#2}]%
}
\newcommand{\argitemlabel}[1]{%
  \@tempdima\linewidth%
  \advance\@tempdima \leftmargin\makebox[\@tempdima][l]{#1}%
}
\newenvironment{arglist}{
  \begin{list}{}{%
      \setlength\labelwidth{\leftmargin}
      \setlength\labelsep{0pt}
      \setlength\rightmargin{0pt}
      \let\makelabel=\argitemlabel%
    }%
}{\end{list}}
\makeatother
\begin{document}
\setstretch{2}
\begin{arglist}
\argitem{function}{args} body
\argitem{function}{\singlelipsum{4}} \singlelipsum{2}
\end{arglist}
\end{document}

问题

顺便说一句,我使用的方法是基于sphinx.stySphinx-doc 所用的方法。我认为他们没有这个问题,因为那里是单倍行距。

答案1

更新(以反映修订后的 MWE):

我唯一改变的不是你不起作用的 MWE 的地方是我\relax\strut\ignorespaces在 的末尾添加了一个\argitem。如果我理解正确的话,\item必须结束,因为你没有文本作为项目的一部分(是的可选参数\parbox的一部分)。因此,任何立即应用的内容都会被重新设置到段落的顶行(作为 的一部分)。基本上阻止了被 吞噬。我的解释可能错了,但有人会纠正我。\item\strut\item\relax\strut\item

\documentclass{article}
\usepackage{setspace,lipsum}
\makeatletter
\newcommand\singlelipsum[1]{%
  \begingroup\let\lips@par\relax\csname lipsum@\@roman{#1}\endcsname
\endgroup }
\newlength{\argwidth}
\newcommand{\argparams}[1]{%
  \parbox[t]{\argwidth}{%
    \setstretch{1.5}%
    #1)%
    %\par\xdef\tpd{\the\prevdepth}%  [1]
    %\strut%  [2]
  }%
  %\par\prevdepth\tpd%  [1]
  %\\\strut\ignorespaces%   [2]
}
\newcommand{\argfunc}[1]{\textbf{#1}(}
\newcommand{\argitem}[2]{
  \settowidth{\argwidth}{\argfunc{#1}}%
  \addtolength{\argwidth}{-2\argwidth}%
  \addtolength{\argwidth}{\textwidth}%
  \item[\argfunc{#1}\argparams{#2}]\relax\strut\ignorespaces%
}
\newcommand{\argitemlabel}[1]{%
  \@tempdima\linewidth%
  \advance\@tempdima \leftmargin\makebox[\@tempdima][l]{#1}%
}
\newenvironment{arglist}{
  \begin{list}{}{%
      \setlength\labelwidth{\leftmargin}
      \setlength\labelsep{0pt}
      \setlength\rightmargin{0pt}
      \let\makelabel=\argitemlabel%
    }%
}{\end{list}}
\makeatother
\begin{document}
\setstretch{2}
\begin{arglist}
\argitem{function}{args} body
\argitem{function}{\singlelipsum{4}} \singlelipsum{2}
\end{arglist}
\end{document}

在此处输入图片描述

原始解决方案(针对原始 MWE):

我发现有两件事正在发生。第一,关于 a 的底部,\parbox可以通过明智地使用\struts 来解决。

第二个问题与 MWE 中常用的材料有关\lipsum[]。当输出 lipsum 段落时,它们包含的不仅仅是文本。它们包含段落格式,形式为\pars 和类似的东西。通常,如果将文本作为 的参数输入\arrowed,则不会以 结尾\par。因此,最好让 lipsum 只输出段落的文本,而不输出结尾\par等。

作者lipsum告诉我如何做到这一点:

\newcommand\singlelipsum[1]{%
  \begingroup\let\lips@par\relax\csname lipsum@\@roman{#1}\endcsname
\endgroup }

\strut因此,通过和的组合\singlelipsum(仅给出单个lipsum段落的文本),可以修复以下问题:

\documentclass{article}
\usepackage{lipsum}
\usepackage{setspace}
\setstretch{1.5}
\setlength{\parindent}{0pt}
\makeatletter
\newcommand\singlelipsum[1]{%
  \begingroup\let\lips@par\relax\csname lipsum@\@roman{#1}\endcsname
\endgroup }
\makeatother
\newlength{\len}
\newcommand{\arrowed}[1]{%
  % draw an arrow, then a parbox that's exactly
  % the remaining width of the line
  \settowidth{\len}{$\rightarrow$}%
  \addtolength{\len}{-2\len}%
  \addtolength{\len}{\textwidth}%
  $\rightarrow$\parbox[t]{\len}{#1\strut}\\\strut\ignorespaces%
}

\begin{document}
\lipsum[2]
\arrowed{\singlelipsum{4}}
\lipsum[6]
\arrowed{But this is OK, since it's only one line.}
\lipsum[2]
\end{document}

在此处输入图片描述

答案2

您的定义\arrowed应如下所示:

\newcommand{\arrowed}[1]{%
  % draw an arrow, then a parbox that's exactly
  % the remaining width of the line
  \settowidth{\len}{$\rightarrow$}%
  \addtolength{\len}{-2\len}%
  \addtolength{\len}{\textwidth}%
  $\rightarrow$\parbox[t]{\len}{#1\par\xdef\tpd{\the\prevdepth}}%
  \par\prevdepth\tpd%
}

这将在设置框深度后恢复其设置,如\baselineskip使用minipages (或es) 时如何保持常数\parbox

在此处输入图片描述

\documentclass{article}
\usepackage{lipsum,setspace}% http://ctan.org/pkg/{lipsum,setspace}
\setstretch{1.5}
\setlength{\parindent}{0pt}

\newlength{\len}
\newcommand{\arrowed}[1]{%
  % draw an arrow, then a parbox that's exactly
  % the remaining width of the line
  \settowidth{\len}{$\rightarrow$}%
  \addtolength{\len}{-2\len}%
  \addtolength{\len}{\textwidth}%
  $\rightarrow$\parbox[t]{\len}{#1\par\xdef\tpd{\the\prevdepth}}%
  \par\prevdepth\tpd%
}

\begin{document}
\lipsum[2]
\arrowed{\lipsum[4]}
\lipsum[6]
\arrowed{But this is OK, since it's only one line.}
\lipsum[2]
\end{document}

但是...使用列表来设置项目可能会更好,因为\parboxes(如minipages)不能跨越页面边界:

\documentclass{article}
\usepackage{lipsum,setspace,enumitem}% http://ctan.org/pkg/{lipsum,setspace,enumitem}
\setstretch{1.5}
\setlength{\parindent}{0pt}

\newlength{\len}
\newcommand{\arrowed}[1]{%
  \begin{itemize}[nosep]\item[{\makebox[2em][r]{$\rightarrow$}}]#1\end{itemize}%
}

\begin{document}
\lipsum[2]
\arrowed{\lipsum[4]}
\lipsum[6]
\arrowed{But this is OK, since it's only one line.}
\lipsum[2]
\end{document}

enumitem提供nosep消除列表、项目和周围内容之间的所有垂直间隙的选项。

答案3

使用该paralist包,并将它们定义为列表项。

梅威瑟:

\documentclass{article}
\usepackage{lipsum}
\usepackage{setspace}
\usepackage{paralist}
\setstretch{1.5}
\setlength{\parindent}{0pt}

\newenvironment{arrowed}{
  \begin{compactitem}[$\rightarrow$]
  \setlength{\itemsep}{0pt}
  \setlength{\parskip}{0pt}
  \setlength{\parsep}{0pt}
}{
  \end{compactitem}
}

\begin{document}
\lipsum[2]
\begin{arrowed}
\item \lipsum[4]
\item \lipsum[4]
\item \lipsum[6]
\end{arrowed}
\lipsum[1]
\begin{arrowed}
\item  This is also OK, since it's only one line.
\end{arrowed}
\lipsum[2]
\end{document}

我修改了你的 sharelatex 文档以反映这些变化。

从 sharelatex 渲染

相关内容