![问题](https://linux22.com/image/469086/%E9%97%AE%E9%A2%98.png)
问题
因此,我正在完成我tcolorbox
的作品的样式,但如果文本比 短,我就无法正确地将文本居中\linewidth
。一种解决方案是\centering
每次都添加,但它不是自动的,我相信有更好的解决方案。
我还希望,如果文本比 短\linewidth
(例如 3),则将框居中,并根据文本的宽度调整框的宽度。否则,保留max width
并\linewidth
跳转到新行(使用\centering
)。
在示例 1 中,居中设置不正确,应该使用halgin=center
类似 的格式,而text=centered
不是\centering
。此外,由于它比 短\linewidth
,因此应该调整框的宽度。
在示例 3 中,框应该居中,对于这个示例我使用了hbox
,如果文本大于,则该方法不起作用\linewidth
。
那么有没有办法将文本较短时的示例 3(框居中)和文本较大时的示例 1(正确居中)结合起来?
平均能量损失
这overlay=
是为了防止万一框太大,需要跳转到另一个页面,边框不是圆的(要知道框还没有完成)。
\documentclass[12pt]{report}
\usepackage{amsmath, amssymb}
\usepackage{tcolorbox}
\tcbuselibrary{skins, breakable}
\newtcolorbox{box1}[1]{title={\centering\large#1}, fonttitle=\bfseries, toptitle=1.5mm, bottomtitle=1.5mm, enhanced, breakable, colback=gray, colframe=black, boxrule=1pt, arc=2mm, rounded corners, coltitle=white, coltext=white, halign=center,
overlay first={
\draw[line width=1pt, black] (frame.south west)--(frame.south east);},
overlay middle={
\draw[line width=1pt, black] (frame.south west)--(frame.south east);
\draw[line width=1pt, black] (frame.north west)--(frame.north east);},
overlay last={
\draw[line width=1pt, black] (frame.north west)--(frame.north east);;}
}
\newtcolorbox{box2}[1]{title={\centering\large#1}, fonttitle=\bfseries, toptitle=1.5mm, bottomtitle=1.5mm, enhanced, breakable, colback=gray, colframe=black, boxrule=1pt, arc=2mm, rounded corners, coltitle=white, coltext=white,
overlay first={
\draw[line width=1pt, black] (frame.south west)--(frame.south east);},
overlay middle={
\draw[line width=1pt, black] (frame.south west)--(frame.south east);
\draw[line width=1pt, black] (frame.north west)--(frame.north east);},
overlay last={
\draw[line width=1pt, black] (frame.north west)--(frame.north east);;}
}
\newtcolorbox{box3}[1]{title={\centering\large#1}, fonttitle=\bfseries, toptitle=1.5mm, bottomtitle=1.5mm, enhanced, breakable, colback=gray, colframe=black, boxrule=1pt, arc=2mm, rounded corners, coltitle=white, coltext=white, hbox,
overlay first={
\draw[line width=1pt, black] (frame.south west)--(frame.south east);},
overlay middle={
\draw[line width=1pt, black] (frame.south west)--(frame.south east);
\draw[line width=1pt, black] (frame.north west)--(frame.north east);},
overlay last={
\draw[line width=1pt, black] (frame.north west)--(frame.north east);;}
}
\begin{document}
\begin{box1}{Formula of $\sin(\theta)$}
$\forall\theta\in\mathbb{R}, \forall k\in\mathbb{Z},\sin(\theta+2\pi k)=\sin(\theta)$
\end{box1}
\begin{box2}{Formula of $\sin(\theta)$}
$\forall\theta\in\mathbb{R}, \forall k\in\mathbb{Z},\sin(\theta+2\pi k)=\sin(\theta)$
\end{box2}
\begin{box3}{Formula of $\sin(\theta)$}
$\forall\theta\in\mathbb{R}, \forall k\in\mathbb{Z},\sin(\theta+2\pi k)=\sin(\theta)$
\end{box3}
\end{document}
答案1
下面的示例基于 OP 的box3
环境,并进行了一些更改:
- 由于使用
breakable
时不支持该选项,因此该选项已被注释掉。hbox
- 选项
varwidth upper
设置框的最大宽度hbox
。它需要varwidth
包装。 - 选项
halign title=flush center
使标题居中,before upper app=\centering
(需要 tcolorbox 库hooks
)使文本(上部)居中,并使center
框居中。- 这里
halign=flush center
没有效果,因为对齐方式被选项varwidth
添加的环境重置了varwidth upper
。 - 和
halign
的可行值和不同。前者使用 LaTeX ,它设置(和更多),而后者(对齐)设置加。当标题文本以多行排版时,差异会很明显。 由于以相对单位设置段落形状和单词间距尺寸,因此居中效果受当前字体大小的影响,这使得 和略有不同。 请参阅相关源代码行halign title
flush center
center
\centering
\rightskip0pt plus 1fil\leftskip0pt plus 1fil
center
\centering
\leftskip0pt plus2em\rightskip0pt plus2em\spaceskip.3333em \xspaceskip.5em \hbadness=10000\relax
halign=center
em
title={\large#1}, fonttitle=\large\bfseries,
title={#1}, fonttitle=\bfseries
[1]和[2]在tcolorbox.sty
v6.0.4 中。
- 这里
\documentclass{article}
\usepackage{amsmath, amssymb}
\usepackage{tcolorbox}
\usepackage{varwidth}
\tcbuselibrary{breakable, hooks, skins}
\usepackage{lipsum}
\newtcolorbox{box3}[1]{
% hbox mode boxes are not breakable
enhanced, % breakable,
hbox,
% tcbox width=auto limited,
center,
varwidth upper,
before upper app=\centering,
halign title=flush center,
title={#1}, fonttitle=\large\bfseries,
toptitle=1.5mm, bottomtitle=1.5mm,
boxrule=1pt,
arc=2mm, rounded corners,
colback=gray, colframe=black,
coltitle=white, coltext=white,
overlay first={
\draw[line width=1pt, black] (frame.south west)--(frame.south east);},
overlay middle={
\draw[line width=1pt, black] (frame.south west)--(frame.south east);
\draw[line width=1pt, black] (frame.north west)--(frame.north east);},
overlay last={
\draw[line width=1pt, black] (frame.north west)--(frame.north east);}
}
\begin{document}
\begin{box3}{Formula of $\sin(\theta)$}
$\forall\theta\in\mathbb{R}, \forall k\in\mathbb{Z},\sin(\theta+2\pi k)=\sin(\theta)$
\end{box3}
\begin{box3}{Formula of $\sin(\theta)$}
\lipsum[1][1-3]
\end{box3}
\begin{box3}{\lipsum[2][1-2]}
$\forall\theta\in\mathbb{R}, \forall k\in\mathbb{Z},\sin(\theta+2\pi k)=\sin(\theta)$
\end{box3}
\begin{box3}{\lipsum[2][1-2]}
\lipsum[1][1-3]
\end{box3}
\newpage
\subsection*{\textsf{halign=center} vs \textsf{halign=flush center}}
\begin{tcolorbox}[
center, halign=center, fontupper=\Huge,
title={\texttt{halign=center, fontupper=\string\Huge}}
]
\leavevmode\llap{\smash{\rule{.4pt}{1em}}}Text Text
\end{tcolorbox}
\begin{tcolorbox}[
center, halign=center, before upper=\Huge,
title={\texttt{halign=center, before upper=\string\Huge}}
]
\leavevmode\llap{\smash{\rule{.4pt}{4em}}}Text Text
\end{tcolorbox}
\begin{tcolorbox}[center, halign=center, title={\texttt{halign=center}}]
\lipsum[1][1-3]
\end{tcolorbox}
\begin{tcolorbox}[center, halign=flush center, title={\texttt{halign=flush center}}]
\lipsum[1][1-3]
\end{tcolorbox}
\end{document}