与我上一个问题类似以 wrapfigure 开头——还有其他想法吗?我想创建一个包裹的环境,在其中我可以采取\parbox
或minipage
环境。
下面的代码展示了用 解决的想法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
}
lettrine
Gonzalo Medina 在回答我上述问题时提供的软件包提供了一个有吸引力的解决方案。我想要的只是一个或\parbox
一个minipage
初始位置的环境。
有什么想法吗?
编辑:
在我测试了 Ulrike 的代码后,我将 parbox 内部位置从底部设置到中心。以下 pdf 应该展示了我的具体想法。(我很抱歉写得这么复杂 :-))
红线表示公式的基线应与其右侧的文本行的高度相同。
灰色条表示还有更多空间。
就这样 :)
答案1
这是 egreg 的答案的抄袭,但我对其进行了修改,以便获得您要求的行对齐。 \begin{definition} 的可选参数的作用现在是其他东西:如果存在,它必须是 number,number 形式,如 2,3,然后它的意思是“在前面放 2 个空白行,在后面放 3 个空白行”。因此,内容将显示在第三行,缩进将在第七行停止。以下是前后各有 2 行的示例:
更新:我已编辑代码,使参数居中,前后留出 15% 的空间。新外观如下:
\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}