根据框内容调节 tcolorbox 选项/类型——根据适合的文本大小进行调整或中断

根据框内容调节 tcolorbox 选项/类型——根据适合的文本大小进行调整或中断

我正在使用 tcolorbox 制作一些带有大量文本的 3x5 卡片。这些卡片通常由几个变化不大的框和一个填充卡片其余部分的最终框(包含描述性文本)组成(使用选项[height fill])。我通常将其用作tcboxfit最终框,以便所有描述性文本都能很好地容纳,但有时最终会变得太小。

我想以某种方式根据其内容来确定最后一个框的选项/类型 - 也就是说,如果适合的文本低于定义的大小阈值(在此示例中为 6pt),则取消适合并制作一个breakable具有固定文本大小的框(可能是 6pt 下限),第二页最终将打印在我的 3x5 卡片的背面。

我已经弄清楚了如何使用 来对适合的文本大小进行条件处理\tcbfitdim。我还发现了nirvana选项,它将执行给定的所有内容,但不绘制框/内容。到目前为止一切顺利。

我曾想过使用布尔标志来跟踪拟合的文本是否太小,然后构造适当的框,但结果并不想传播到框本身之外。无论内部发生什么,以下示例始终会打印“false” tcboxfit

%%%%%%%%%% PREAMBLE %%%%%%%%%%
\documentclass{article}

\usepackage[many]{tcolorbox}
\usepackage{lipsum}
\usepackage{geometry}
\usepackage{printlen}
\usepackage{xifthen}

\newboolean{fittoosmall}

\geometry{paperwidth=3in,paperheight=5in,margin=0.05in,bottom=0.03in}

%%%%%%%%%% DOCUMENT %%%%%%%%%%
\begin{document}

    \tcbset{colback=white, colframe=black, beforeafter skip=0em}

    \newcommand{\boxcontent}{
        \lipsum[5]
        \lipsum[5]
        \lipsum[5]
        \lipsum[5]
        \par
    }

    \begin{tcolorbox}
        static box here
    \end{tcolorbox}
    \tcboxfit[height fill, fit basedim=12pt]{
        \boxcontent
        \ifthenelse{\lengthtest{\tcbfitdim<6pt}}{
            too small! \printlength{\tcbfitdim}
            \setboolean{fittoosmall}{true}
        }{
            all good! \printlength{\tcbfitdim}
            \setboolean{fittoosmall}{false}
        }
    }

    \ifthenelse{\boolean{fittoosmall}}{true}{false}

\end{document}

除此之外,我只有一种模糊的感觉,我可能需要以pgfkeys某种方式使用它,但如果没有必要,我宁愿不去那里。有没有 tcolorbox 爱好者愿意发表意见?有没有办法让我的布尔策略发挥作用?我应该考虑另一种策略?我在项目的其他部分使用 LuaLaTeX,因此欢迎基于 Lua 的想法/解决方案。

答案1

虽然不是很优雅,但我找到了一个解决方案。TeX 布尔值不想在 tcolorbox 环境之外传播,但分配一个 Lua 布尔变量却能解决问题。使用设置布尔值的选项进行测试tcboxfitnirvana然后根据结果制作真正的框。示例:

%%%%%%%%%% PREAMBLE %%%%%%%%%%
\documentclass{article}

\usepackage[many]{tcolorbox}
\usepackage{lipsum}
\usepackage{geometry}
\usepackage{printlen}
\usepackage{xifthen}
\usepackage{luacode}

\newboolean{fittoosmall}

\geometry{paperwidth=3in,paperheight=5in,margin=0.05in,bottom=0.03in}

%%%%%%%%%% DOCUMENT %%%%%%%%%%
\begin{document}

    \tcbset{colback=white, colframe=black, beforeafter skip=0em}

    \newcommand{\boxcontent}{
        \lipsum[5]
        \lipsum[5]
        \lipsum[5]
        \lipsum[5]
        \par
    }

    \begin{tcolorbox}
        static box here
    \end{tcolorbox}

    \tcboxfit[height fill, fit basedim=12pt, nirvana]{
        \boxcontent
        \ifthenelse{\lengthtest{\tcbfitdim<6pt}}{
            too small! \printlength{\tcbfitdim}
            \directlua{fittoosmallbool="true"}
        }{
            all good! \printlength{\tcbfitdim}
            \directlua{fittoosmallbool="false"}
        }
    }
    
    \ifthenelse{\equal{\directlua{tex.sprint(fittoosmallbool)}}{true}}{
        \begin{tcolorbox}[breakable,fontupper=\scriptsize]
            \boxcontent
        \end{tcolorbox}
    }{
        \tcboxfit[height fill, fit basedim=12pt]{\boxcontent}
    }

\end{document}

这仅在您使用 LuaLaTeX 时才有效,并且可能不是每种用例的最佳解决方案,但它非常适合我的需求。希望这对将来的其他人有用。

相关内容