Parbox 作为初始

Parbox 作为初始

与我上一个问题类似以 wrapfigure 开头——还有其他想法吗?我想创建一个包裹的环境,在其中我可以采取\parboxminipage环境。

下面的代码展示了用 解决的想法wrapfigure

\newcommand{\definition}[1]{
\settowidth{\test}{#1}
\begin{wrapfigure}[3]{l}{1.2\test}
\begin{minipage}[c][3\baselineskip][c]{1.2\test}
\centering%
{}#1{}
\end{minipage}
\end{wrapfigure}\par
}

lettrineGonzalo Medina 在回答我上述问题时提供的软件包提供了一个有吸引力的解决方案。我想要的只是一个或\parbox一个minipage初始位置的环境。

有什么想法吗?

编辑:

在我测试了 Ulrike 的代码后,我将 parbox 内部位置从底部设置到中心。以下 pdf 应该展示了我的具体想法。(我很抱歉写得这么复杂 :-)) 数学公式应该与右侧的线处于同一高度

红线表示公式的基线应与其右侧的文本行的高度相同。

灰色条表示还有更多空间。

就这样 :)

答案1

这是 egreg 的答案的抄袭,但我对其进行了修改,以便获得您要求的行对齐。 \begin{definition} 的可选参数的作用现在是其他东西:如果存在,它必须是 number,number 形式,如 2,3,然后它的意思是“在前面放 2 个空白行,在后面放 3 个空白行”。因此,内容将显示在第三行,缩进将在第七行停止。以下是前后各有 2 行的示例:

e=mc^2 作为字母

更新:我已编辑代码,使参数居中,前后留出 15% 的空间。新外观如下:

e=mc^2 为中心字母

\documentclass{article}
\usepackage{lipsum}

\newsavebox{\defbox}
\newcount\mycount
\newtoks\strutlines

\def\numbefore #1,#2,{#1}
\def\numafter #1,#2,{#2}
\def\numtotal #1,#2,{\numexpr #1+#2+1}

\def\insertstrutlines #1{\mycount=#1\strutlines={}%
\loop\ifnum\mycount > 0 \advance\mycount by -1\relax 
\expandafter\strutlines\expandafter{\the\strutlines \strut \\} \repeat
\the\strutlines}

\newenvironment{definition}[2][1,1]{%
    \sbox\defbox{%
        \begin{tabular}[t]{@{}c@{}} 
        \insertstrutlines{\numbefore #1,} 
        \strut\smash{#2}\\ 
        \insertstrutlines{\numafter #1,}
        \end{tabular}}%
  \par\addvspace{\topsep}
  \hangindent=1.3\wd\defbox \hangafter-\numtotal #1,
  \noindent\llap{%
    \makebox[1.3\wd\defbox][c]{\smash{\usebox\defbox}}}%
  \ignorespaces}
 {\par\addvspace{\topsep}}

\begin{document}

\begin{definition}{$\displaystyle\int_0^{2s} f''(t)\mathrm{d}t$}
\lipsum[1]
\end{definition}

\begin{definition}[1,2]{$\int_0^{2s} f''(t)\mathrm{d}t = f'(2s)-f'(0)$}
\lipsum[2]
\end{definition}

\begin{definition}[2,2]{\huge $E = m c^2$}
  \lipsum[6]
\end{definition}

\end{document}

答案2

\documentclass[a4paper]{article}
\newsavebox{\defbox}
\newenvironment{definition}[2][]{%
  \sbox\defbox{#1\begin{tabular}[t]{@{}l@{}}#2\end{tabular}}%
  \count255=\numexpr1+(\dimexpr(\ht\defbox+\dp\defbox))/%
    \numexpr(\baselineskip)\relax
  \par\addvspace{\topsep}
  \hangindent=1.2\wd\defbox \hangafter-\count255
  \noindent\llap{%
    \makebox[1.2\wd\defbox][l]{\smash{\usebox\defbox}}}%
  \ignorespaces}
 {\par\addvspace{\topsep}}
\usepackage{lipsum}
\begin{document}
\lipsum[2]

\begin{definition}[\bfseries]{abc\\def\\ghijklmnop}
\lipsum[1]
\end{definition}

\lipsum[2]
\end{document}

这与 Ulrike 的解决方案类似,但会自动测量必须放入“窗口”中的文本。在可选参数中,可以放置“窗口”中文本的声明,这些文本在表格环境中排版。

解释。

我们保留一个框用于进行测量(\defbox);在这个框中,我们将要在“窗口”中显示的文本设置为单列左对齐表格的行;在表格之前,我们执行可选参数中规定的可能声明。强制参数应采用适合表格的形式,即以 分隔的行\\

接下来,我们测量材料的高度 + 深度,并将该长度除以\baselineskip;我们加 1 在底部留出一个空间:这个数字表示必须缩进多少行。

现在我们设置材料:(1)我们像通常的定理类环境一样留出一个空格;(2)我们设置悬挂缩进(比“窗口”宽度多 20%)和缩进行数(见下文);我们说并将\noindent已经排版的表格放在\defbox零宽度框(\llap)中,与我们在“粉碎”它之后排版“窗口”的边距齐平(因此它不会影响出现的行的大小);(3)我们说\ignorespaces要避免出现虚假空格,因为每当环境的起始代码排版文本时都必须这样做。

在环境的末尾我们留下一个与开始时留下的间隔相等的空间。

\hangindent将所需的缩进作为参数(不在括号中);\hangafter指定此缩进应在何时生效:如果数字n为正后,压痕将开始于n行数;如果数字为负数,则缩进将从第一行开始,并在行号之后结束-n。需要注意的是,这两个参数在下一个\par命令(在同一组级别)后将重置为零。

答案3

\RequirePackage{fix-cm}
\documentclass[11pt]{scrartcl}
\usepackage[T1]{fontenc}
\usepackage{lettrine}
\begin{document}
\newbox\initial
\sbox\initial{\parbox[b]{3cm}{\centering abc\\blub}}
\lettrine[lines=3, lraise=0.1, nindent=0em]%
{\usebox\initial}{ello}, here is some text without a meaning. This text
should show, how a printed text will look like at this place. If you read
this text, you will get no information. Really? Is there no
information?Hello, here is some text without a meaning. This text should
show, how a printed text will look like at this place. If you read this text,
you will get no information. Really? Is there no information?

\end{document}

相关内容