鉴于这种:
\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.sty
Sphinx-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
可以通过明智地使用\strut
s 来解决。
第二个问题与 MWE 中常用的材料有关\lipsum[]
。当输出 lipsum 段落时,它们包含的不仅仅是文本。它们包含段落格式,形式为\par
s 和类似的东西。通常,如果将文本作为 的参数输入\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
使用minipage
s (或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}
但是...使用列表来设置项目可能会更好,因为\parbox
es(如minipage
s)不能跨越页面边界:
\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 文档以反映这些变化。