类似 \raisebox 的东西尊重换行符

类似 \raisebox 的东西尊重换行符

如果想要提出一些文本,可以使用类似

\raisebox{0.5 em}{some text}

但是,这不尊重换行符并且可能会导致一些严重的溢出。

有没有办法\raisebox尊重换行符?或者有提供相同功能的替代方案?

编辑:这里有一个澄清的例子:

\documentclass{article}

\begin{document}

Lorem ipsum dolor sit amet,
\raisebox{0.5 em}{consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.}

\end{document}

我需要凸起的文本进行换行,就像它没有凸起时一样。

编辑2:显然我的解释没什么帮助。我想提升整个句子,如果我使用,\raisebox句子会溢出到右边(如示例中所示)。

如果这是 HTML,我会使用<sup>some text</sup>能够处理换行符的功能。

答案1

正如 @egreg 所说,这在 TeX 中无法完全自动实现,原因很简单:TeX 无法自动确定单词中的连字符点并以默认方式以外的方式使用它们。

但是如果你准备自己标记连字符,那么有办法自动完成其余部分。下面是一个简单的实现:

\documentclass{article}

\setlength\textwidth{8cm}

\def\X#1{\raisebox{0.5em}{#1}}

\def\Y#1#2#3{\discretionary{\X{#1}}{\X{#2}}{\X{#3}}} 

\begin{document}

Lorem ipsum dolor sit amet, consectetur 
\Y{adipisic-}{ing}{adipisicing} \X{elit,} \X{sed} do eiusmod tempor incididunt ut
 labore et dolore magna aliqua.

\end{document}

这导致

在此处输入图片描述

我认为这就是您想要的输出。当然,这不是您想要的编码方式。通过一些小的编码改进,您可以使用类似

Lorem ipsum dolor sit amet, consectetur 
\begin{raisedtext}{0.5em}
  adipisic\-ing elit, sed
\end{raisedtext}
do eiusmod tempor incididunt ut labore et dolore magna aliqua.

在哪里

  • 可能的连字点由\-
  • -自动允许作为连字符点

基本上,您需要解析文本直到环境结束以寻找-\-或“空格”,并相应地从上面构建类似\Y和的东西(今晚不这样做:-)\X

更新:一个简单的解析器

好的,这里有一个简单的解析器,它处理\-和显式-。写得不是很干净,抱歉。

\documentclass{article}

\setlength\textwidth{8cm}

% we need space, -, and newline active and set to some commands
{\obeyspaces
\catcode`\^^M\active%
\catcode`\-\active%
\gdef\setraisedtextactivedef#1#2{\let =#1\let^^M=#1\let-=#2}}

\newbox\raisedtextbox

% main action is to collect material into a box
\def\collectraisedtext{\setbox\raisedtextbox\hbox\bgroup\raisedtextstyle
\gobbleactivespaces}

% and if we want we can use a special style
\def\raisedtextstyle{\small\itshape}

% at a space end collection, typeset and restart
\def\raisedtextspace{\egroup
       \X{\box\raisedtextbox}%
      \space
      \collectraisedtext
}                              

% at \- end colloection, typeset, add discretionary and restart
\def\raisedtextbreak{\egroup\X{\box\raisedtextbox}\discretionary{\X-}{}{}\collectraisedtext}
% at - (explicit hyphen) more or less the same
\def\raisedtexthyphen{\egroup\X{\box\raisedtextbox}\discretionary{\X-}{}{\X-}\collectraisedtext}

% several active spaces (or newlines) would do harm ...
\def\gobbleactivespaces{\futurelet\next\gobbleactivespacesX}
\def\gobbleactivespacesX{%
            \ifx\next\raisedtextspace
               \expandafter\gobbleactivespacesXX
           \fi
}
\def\gobbleactivespacesXX#1{\gobbleactivespaces}

% putting all together
\newenvironment{raisedtext}[1][0.5ex]
  {%
    \def\X##1{\raisebox{#1}{##1}}%
    \obeyspaces
    \catcode`\^^M\active
    \catcode`\-\active
    \setraisedtextactivedef\raisedtextspace\raisedtexthyphen
    \let\-\raisedtextbreak
    \collectraisedtext
}{%
% at end environment, end collection and typeset (if not empty). 
% Otherwise remove space already inserted before that collection
       \egroup
       \ifdim\wd\raisedtextbox>0pt  % weak prove that this is not empty
         \X{\box\raisedtextbox}%
       \else
         \unskip
       \fi
}

\begin{document}

Lorem ipsum dolor sit amet, consectetur 
\begin{raisedtext}
      adipisic-ing       elit,      sed
\end{raisedtext}
 do eiusmod tempor incididunt ut
 \begin{raisedtext}[1.5ex] la-bore-et do-lore
\end{raisedtext}  magna aliqua.

\end{document}

这样做会给我们(带有样式定义的\small\itshape

在此处输入图片描述

答案2

您需要首先使用允许构建段落的框,例如\parboxminipage环境。两者都需要使用线宽作为参数,这可能是一个问题。还有varwidth基于包的环境minipagevarwidth它仅将宽度参数作为最大宽度。

你可以试试:

\usepackage{varwidth}
% ..
\raisebox{<amount>}{\begin{varwidth}{<max width>} multi \\ line \\ text\end{varwidth}}

另一种选择是我的adjustbox包,它提供了raiseminipagevarwidth。它与上面的基本相同,但界面更漂亮:

\usepackage{adjustbox}
% ..
\adjustbox{varwidth=<max width>,raise=<amount>}{ multi \\ line \\ text }
% or:
\adjustbox{varwidth=<max width>,raise=<amount>}\bgroup multi \\ line \\ text \egroup
% or:
\begin{adjustbox}{varwidth=<max width>,raise=<amount>}
     multi \\ line \\ text
\end{adjustbox}

请注意\parboxminipagevarwidth具有可选参数,它们决定了所生成框的基线。这些参数会影响文本相对于框外但仍在同一行上的其他文本的位置。

答案3

你可以简单地通过以下方式提出一个文本块:

\vspace*{<-dimension>}

调整 MWE 示例中的 (-5pt) 来查看其如何工作。

\documentclass[11pt]{article}
\usepackage{lipsum}
\parskip10pt
\parindent0pt
\begin{document}
First paragraph
\hrule

\vspace*{-5pt} 
\lipsum[1]
\end{document}

答案4

类似于\raise(水平模式) 带有\vbox? (plain-tex)

\hsize=24pc % just to make it break into lines

Lorem ipsum dolor sit amet,

\noindent\raise.5em\vbox{\noindent
  consectetur adipisicing elit, sed do
  eiusmod tempor incididunt ut labore et dolore magna aliqua.}

Lorem ipsum dolor sit amet.
\bye

相关内容