使用 IfValueT 传递参数

使用 IfValueT 传递参数

我见过以下用法:

\NewTColorBox[]{containerbox}{o o}{
    %invisible boxes for sections (now grey)
    boxsep=0cm,
    boxrule=0cm,
    sharp corners,
    left=0cm,
    right=0cm,
    top=0cm,
    bottom=0cm,
    leftright skip=0cm,
    nobeforeafter,
    IfValueT={#1}{width=#1},
    IfValueT={#2}{equal height group=#2},
}

我想了解结尾前的最后两行是如何}工作的。我已经看到了如何IfValueT作为条件语句工作,如IfValueT{condition}{code_if_condition_met}{code_if_condition_unmet}。但用法

IfValueT = {#1}{width=#1} 

看起来很奇怪,因为感觉\NewTColorBox应该将其视为IfValueT一个论点......但不知何故却没有??

它的使用方式似乎是如果第一个可选参数将被传递,然后在创建 的实例时containerbox将 width 参数传递给,如果不是,则不会将 width 参数传递给。我理解得对吗?如果是,它是如何工作的?编译器是否只是以特殊方式将 视为参数?并且会不会出现类似\NewTColorBoxcontainerbox\NewTColorBoxIfValueT

\NewTColorBox[]{containerbox}{o}{
IfValueT = {#1}{width=#1}{width=1.0}
}

如果在没有传递可选参数的情况下我想要宽度为 1,也可以这样做吗?

使用方法

\NewTColorBox[]{containerbox}{o}{
left=0cm,
IfValueT{#1}{width=#1}{width=1.0}
}

这是否可行并且与我之前所做的事情相同?

答案1

IfValueT键被定义为一个带有三个参数的键,其定义如下所示(来自tcolorbox.sty——我添加的行号):

875   \ExplSyntaxOn
876   \tcbset
877     {
...   
888       IfValueT/.code~n~args={2}{\tl_if_novalue:nF{#1}{\pgfkeysalso{#2}}},
...   
893     }
894   \ExplSyntaxOff

因此,该键的作用是在等号后获取两个参数,然后检查第一个参数是否是特殊的无值标记(这是o类型参数的默认值),如果不是,则使用\pgfkeysalso{#2}哪个来设置其他键。所以IfValueT这只是一个执行一些有用代码的简单键。

另一个有用的键是IfValueTF允许您要求的操作,即如果给出了值或没有给出值则设置不同的键:

\NewTColorBox[]{containerbox}{o}
  {
    left=0cm,
    IfValueTF={#1}{width={#1}}{width=1.0}
  }

但是如果您只想使用默认值并始终使用它(在这种情况下,行为与省略解决方案中的键width不同),那么为可选参数设置默认值要简单得多:widthIfValueT={#1}{width={#1}}width

\NewTColorBox[]{containerbox}{O{1.0cm}}
  {
    left=0cm,
    width={#1}
  }

使用具有默认值的建议可选参数的示例文档:

\documentclass{article}

\usepackage{tcolorbox}

\NewTColorBox{containerbox}{O{1cm}}{left=0cm, width={#1}}

\begin{document}
\begin{containerbox}
  some thin box
\end{containerbox}
\begin{containerbox}[5cm]
  some thick box
\end{containerbox}
\end{document}

结果:

在此处输入图片描述

相关内容