我想动态计算 的宽度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 的整数倍???