如何水平移动易碎的 tcolorbox?

如何水平移动易碎的 tcolorbox?

我想tcolorbox在页面中以相同的水平位置显示易碎物品,即使它们位于列表项中。我可以处理不可碎的盒子,但不能处理易碎的盒子,如以下 MCE 所示。

因此问题是:如何水平移动可破碎物tcolorbox

\documentclass{article}
\usepackage{showframe}
\usepackage{calc}
\usepackage{lipsum}
\usepackage{tcolorbox}

\tcbuselibrary{breakable}

\newlength{\myshift}

\newtcolorbox{mybox}[1][]{
  text width=\textwidth,
  before={%
    \setlength{\myshift}{\linewidth-\textwidth-5.5mm}%
    \smallskip\par
    \noindent\hspace*{\myshift}%
  },
  #1
}

\newcommand{\test}[1][]{%
  Foo\par
  \begin{mybox}[#1]
    \lipsum[1]
  \end{mybox}
}

\begin{document}
\section{Non-beakable}
\test
\begin{enumerate}
\item \test
\end{enumerate}
\newpage
\section{Beakable}
\test[breakable]
\begin{enumerate}
\item \test[breakable]
\end{enumerate}
\end{document}

在此处输入图片描述

答案1

在列表环境中,总左边距存储在维度中\@totalleftmargin。因此,您可以使用enlarge left by=-5.5mm-\@totalleftmargin来替换before=...

\documentclass{article}
\usepackage{showframe}
\usepackage{calc}
\usepackage{lipsum}
\usepackage{tcolorbox}

\tcbuselibrary{breakable}

\makeatletter
\newtcolorbox{mybox}[1][]{
  text width=\textwidth,
  enlarge left by=-5.5mm-\@totalleftmargin,
  #1
}
\makeatother

\newcommand{\test}[1][]{%
  Foo\par
  \begin{mybox}[#1]
    \lipsum[1]
  \end{mybox}
}

\begin{document}
\section{Non-beakable}
  \test
  \begin{enumerate}
  \item \test
  \end{enumerate}
  \newpage

\section{Beakable}
  \test[breakable]
  \begin{enumerate}
  \item \test[breakable]
  \end{enumerate}
\end{document}

备注:before=...仅适用于破框序列中的第一个框,请参阅文档tcolorbox,第 18.1 节技术概述(图书馆)breakable)技术概述

相关内容