使用 pgfmath 动态计算 tcolorbox 选项

使用 pgfmath 动态计算 tcolorbox 选项

我想动态计算 的宽度tcolorbox。可以使用 吗pgfmath

这是我目前所拥有的:

\documentclass{article}
\usepackage{tikz}
\usepackage{tcolorbox}

\begin{document}
\pgfmathsetlengthmacro{\y}{%
    floor(\linewidth / \baselineskip) * \baselineskip} 
y: \y

\begin{tcolorbox}[width={\pgfmathsetlengthmacro{\x}{%
    floor(\linewidth / \baselineskip) * \baselineskip} \x}]
This is my box.
\end{tcolorbox}

\end{document}

问题是它会产生错误消息:! Missing number, treated as zero.。我猜想在选项查找数字之前宏实际上并没有被评估width。有没有办法实现这样的事情?

答案1

\pgfsetmathlengthmacro是一个定义(“设置”)另一个宏的命令,并且无法通过这种方式扩展,因此width={\pgfsethmathlengthmacro{...}}\x在这里不起作用。

然而,可以“利用”该code=...选项并使用width=\x

我已经展示了的值\kvtcb@width,为了使用这个宏,\makeatletter...\makeatother这是必要的:

\documentclass{article}
\usepackage{tikz}
\usepackage{tcolorbox}

\begin{document}
\pgfmathsetlengthmacro{\y}{%
    floor(\linewidth / \baselineskip) * \baselineskip} 
y: \y


\makeatletter
\begin{tcolorbox}[code={\pgfmathsetlengthmacro{\x}{%
    floor(\linewidth / \baselineskip) * \baselineskip}},width=\x]
This is my box and it has the width \kvtcb@width
\end{tcolorbox}

\begin{tcolorbox}[code={\pgfmathsetlengthmacro{\x}{%
    floor(\linewidth / \baselineskip) * \baselineskip}},width=336pt]
This is my box and it has the width \kvtcb@width
\end{tcolorbox}

\makeatother

\end{document}

在此处输入图片描述

答案2

\documentclass{article}
\usepackage{tcolorbox,expl3}
\ExplSyntaxOn\let\calcnum\fp_to_decimal:n\ExplSyntaxOff
\makeatletter\let\stripPT\strip@pt\makeatother
\def\getWidth{\calcnum {floor(\stripPT\linewidth/% 
      \stripPT\baselineskip)*\stripPT\baselineskip}pt}
\begin{document}

\getWidth

\begin{tcolorbox}[width=\getWidth]
This is my box and it has the internal linewidth \the\linewidth
\end{tcolorbox}

\begin{tcolorbox}[width=336pt]
This is my box and it has the internal linewidth \the\linewidth
\end{tcolorbox}

\end{document}

在此处输入图片描述

答案3

借助 e-TeX ,您可以做到这一点\dimexpr/\numexpr。不幸的是,除法是按\numexpr轮次进行的,因此公式对于函数来说有点复杂floor。(参见为什么 \numexpr 整数除法会四舍五入而不是截断?

\documentclass[a4paper]{article}
\usepackage{tikz}
\usepackage{tcolorbox}

\begin{document}

\pgfmathsetlengthmacro{\y}{%
    floor(\linewidth / \baselineskip) * \baselineskip} 

y: \y

\the\dimexpr\numexpr(\linewidth+\baselineskip/2)/\baselineskip-1\relax\baselineskip\relax


linewidth: \the\linewidth

baselineskip: \the\baselineskip

\hrule

\begin{tcolorbox}[width={\dimexpr\numexpr(\linewidth+\baselineskip/2)/\baselineskip-1\relax\baselineskip\relax}]
This is my box and it has width \the\dimexpr\csname kvtcb@width\endcsname.

linewidth: \the\linewidth

baselineskip: \the\baselineskip

floor(linewidth/baselineskip): \the\numexpr(\linewidth+\baselineskip/2)/\baselineskip-1\relax

width: \the\dimexpr\numexpr(\linewidth+\baselineskip/2)/\baselineskip-1\relax\baselineskip\relax

\hrule

\end{tcolorbox}

\end{document}

在此处输入图片描述

话虽这么说,但理解线宽/基线跳跃比率的含义以及为什么需要宽度是 baselineskip 的整数倍???

相关内容