在小页面内自动/可变垂直对齐?

在小页面内自动/可变垂直对齐?

我定义了一个新环境,用于突出显示文本中的警告。下面是我使用的代码的一个简单示例:

\documentclass[parskip]{scrartcl}
\usepackage{fourier} % for the bomb
\usepackage{lipsum}

\newenvironment{warning}{%
  \begin{minipage}[t][\height][c]{0.12\textwidth}%
    {\Huge{\bomb}}%
  \end{minipage}%
  \begin{minipage}[t]{0.88\textwidth}
    \begin{sloppypar}%
}{%
    \end{sloppypar}%
  \end{minipage}%
  \hspace{-\parfillskip}%
}

\begin{document}
\lipsum[1]

\begin{warning}
\lipsum[2]
\end{warning}

\lipsum[3]

\begin{warning}
This is just a short warning.
\end{warning}

\lipsum[4]

\end{document}

这基本上可以按预期工作,至少对于较长的警告来说是这样。如果警告文本只有一两行,符号旁边的文本的垂直对齐方式就会开始显得奇怪。如果我将小页面的垂直对齐方式从更改为tc短警告的整体间距会有所改善,但这也会改变较长的警告,我认为这是一种更糟糕的布局。我意识到我可以通过两个不同的环境来解决这个问题,分别针对短警告和长警告,但有没有办法自动化呢?喜欢如果右侧列的内容超出了 ... 的高度,则使用此对齐方式,否则使用另一个对齐方式

(我还会接受指向以更强大/专业/酷的方式提供类似突出显示的软件包的指针:-))

答案1

我对以下问题的回答进行了修改根据特定段落高度规则对齐边注中的图像

警告:为了保证测量结果正确,警告应该只有一段。

\documentclass[a4paper]{article}
\usepackage[top=2.5cm,bottom=2.5cm]{geometry}
\usepackage{environ}
\usepackage{fourier}

\makeatletter
\NewEnviron{warning}{%
  %% Count the number of lines
  \setbox\z@=\vbox{\hsize=.88\textwidth\BODY\par
                   \xdef\vw@nlines{\the\prevgraf}}%
  %% Typeset the warning; .12+.88=1
  \begin{list}{}{%
      \leftmargin=.12\textwidth
      \clubpenalties=4 10000 10000 10000 0
    }%
    \ifcase\vw@nlines\or % no empty paragraphs
      \vw@placefigure{0}%
    \or
      \vw@placefigure{.5}%
    \else
      \vw@placefigure{1}%
    \fi
    \BODY
  \end{list}%
}
\def\vw@placefigure#1{\item[\leavevmode\smash{\makebox[0pt][r]{%
  \vbox{\hbox{\Huge\bomb}
        \vskip-9pt % half the height of the bomb
        \vskip-#1\baselineskip % shift down
       }}}]}
\makeatother

\usepackage{lipsum}

\begin{document}
\lipsum[3]

\begin{warning}
\lipsum[3]
\end{warning}

\lipsum[3]

\begin{warning}
This is just a short warning.
\end{warning}

\lipsum[3]

\begin{warning}
A two line\\
warning
\end{warning}

\lipsum[3]

\begin{warning}
A three\\
line\\
warning
\end{warning}

\begin{warning}
\lipsum[3]
\end{warning}

\end{document}

这也允许分页,但仅限于警告文本的三行之后。

在此处输入图片描述

答案2

为了得到你想要的,我必须将环境更改warning\warningmacro,因为我需要测量文本的高度才能决定炸弹的放置位置。基本上,我将其适当地放置在一行警告的位置,然后开始将其向下移动文本深度的 70%,直到达到最大移动限制。要使用的两个参数是长度\reflength和标量值\shiftmult,当前设置为 22pt 和 0.7。炸弹的最大垂直偏移量为\shiftmult\reflength

\documentclass[parskip]{scrartcl}
\usepackage{fourier} % for the bomb
\usepackage{lipsum}
\usepackage{stackengine}
\newlength\warndepth

\newsavebox\warnpar
\newlength\reflength
\setlength{\reflength}{22pt}
\def\shiftmult{0.7}
\newcommand\warningmacro[1]{%
  \sbox\warnpar{\parbox[t]{0.88\textwidth}{%
    \begin{sloppypar}%
    #1%
    \end{sloppypar}%
    }
  }%
  \def\bigbomb{\Huge{\bomb}}%
  \setlength\warndepth{\depthof{\usebox{\warnpar}}}%
  \ifdim\warndepth>\reflength \setlength\warndepth{\reflength}\fi%
  \belowbaseline[\shiftmult\warndepth-1.5\baselineskip]{%
    \makebox[.12\textwidth][l]{\bigbomb}%
  }%
  \usebox{\warnpar}%
  \hspace{-\parfillskip}%
}

\begin{document}
This is normal text%\lipsum[1]

\warningmacro{%
Let's see what happens when we get a two-line warning
Let's see what happens when we get a two-line warning
}

This is more normal text

\warningmacro{%
Let's see what happens when we get a three-line warning
Let's see what happens when we get a three-line warning
Let's see what happens when we get a three-line warning
Let's see what happens when we get a three-line warning
}

This is more normal text

\warningmacro{%
\lipsum[2]
}

\lipsum[3]

\warningmacro{%
This is just a short warning.
}

\lipsum[4]

\end{document}

在此处输入图片描述

相关内容