Tcolorbox 自动调整到当前文本大小并且文本填满段落的最后一行

Tcolorbox 自动调整到当前文本大小并且文本填满段落的最后一行

我有一个简单的 Latex 代码

\documentclass{article}
\usepackage[many,listings]{tcolorbox}
\usepackage{lipsum}

\tcbset{
box1/.style={
    boxrule=1pt,
    breakable,
    enhanced,
    boxsep=0.25ex,
    left=8pt,
    right=8pt,
    arc=0mm,
    colback=yellow!15,
    colframe=red,
before=\par\vspace{12pt plus 3pt minus 3pt},
after=\par\vspace{6pt plus 2pt minus 2pt},
}
}

\begin{document}

\lipsum[1]

\begin{tcolorbox}[box1]
 Praesent eget sem vel leo ultrices bibendum. Aenean
faucibus. Morbi dolor nulla, malesuada eu
\end{tcolorbox}

\lipsum[2]

\end{document}

我得到以下 PDF 文件

在此处输入图片描述

我想要获得一个tcolorbox自动调整到当前文本大小(多行文本)的文本,以便文本的最后几行是完整的并且框居中,如下图所示

在此处输入图片描述

如果我手动调整框左侧和右侧的跳过,我就可以做到这一点

\begin{tcolorbox}[box1,left skip=20mm, right skip=20mm]
 Praesent eget sem vel leo ultrices bibendum. Aenean
faucibus. Morbi dolor nulla, malesuada eu
\end{tcolorbox}

我认为这是可行的。如果有人知道解决方案,请帮助我。

答案1

我做了什么

如果文本的宽度小于可能的最大宽度,我会将文本的宽度作为的宽度tcolorbox

否则,我会将文本的总宽度除以最大可能宽度,以得出文本所需的行数(结果四舍五入为最接近的整数)。这是一种非常有效的方法,因为 LaTeX 肯定采用了更复杂的算法。

作为最大宽度,我使用线宽减去右/左间隙(8pt+8pt)、boxrules(1pt+1pt)和boxseps(.25ex+.25ex)的宽度,但当然,您可以选择不同的最大宽度。

之后,我将文本的总宽度除以行数,以获得最接近适合文本的宽度。由于之前提到的 row 方法,我添加了一个小缓冲区(可自定义,这是\mytcb我创建的命令的一个可选参数,默认值为1pt),以避免行尾只有一个单词。

最后,我通过包定义了一个字间拉伸,soul使最后一行填补了不使用它而剩下的小空隙,当然这些参数也可以改变:

\sodef{\mystreching}{}{0pt}{2pt plus 1 fill minus 1pt}{0pt}

警告

我确信我的解决方案并不总是有效,但我希望您可以通过修改可选参数来解决(我希望残留的)错误情况。

\documentclass{article}
\usepackage[many,listings]{tcolorbox}
\usepackage{lipsum}
\usepackage{ifthen}
\usepackage{calc}
\usepackage{soul}
\sodef{\mystreching}{}{0pt}{2pt plus 1 fill minus 1pt}{0pt}
\tcbset{
box1/.style={
    boxrule=1pt,
    breakable,
    text width=\widthofmytcb,
    center,
    enhanced,
    boxsep=0.25ex,
    left=8pt,
    right=8pt,
    arc=0mm,
    colback=yellow!15,
    colframe=red,
before=\par\vspace{12pt plus 3pt minus 3pt},
after=\par\vspace{6pt plus 2pt minus 2pt},
}
}
\newlength{\widthofmytext}
\newlength{\widthofmytcb}
\newlength{\maxwidthpossible}
\pgfmathsetlength{\maxwidthpossible}{\linewidth-18pt-.5ex}%
\newcommand{\mytcb}[2][1pt]{%
    \settowidth{\widthofmytext}{#2}%
    \ifthenelse{\lengthtest{\widthofmytext<\maxwidthpossible}}{% then
        \setlength{\widthofmytcb}{\widthofmytext}%
        }{% else
        \pgfmathparse{int(\widthofmytext/\maxwidthpossible)+1}%
        \edef\numberoflines{\pgfmathresult}%
        \pgfmathsetlength{\widthofmytcb}{\widthofmytext/\numberoflines+#1}%
        }%
    \begin{tcolorbox}[box1]
     \mystreching{#2}
    \end{tcolorbox}%
    }

\begin{document}
\lipsum[1]

\mytcb{Praesent eget sem vel leo ultrices bibendum. Aenean
faucibus. Morbi dolor nulla, malesuada eu}

\mytcb{One row} 

\mytcb{Two rows Two rows Two rows Two rows Two rows Two rows Two rows 
Two rows}

\mytcb{Three rows Three rows Three rows Three rows Three rows Three rows 
Three rows Three rows Three rows Three rows Three rows Three rows Three rows}

\mytcb{Four rows Four rows Four rows Four rows Four rows Four rows Four rows
Four rows Four rows Four rows Four rows Four rows Four rows Four rows 
Four rows Four rows Four rows Four rows Four rows Four rows Four rows 
Four rows Four rows Four rows Four rows}

\lipsum[2]

\end{document}

在此处输入图片描述

相关内容