为什么我不能将逗号放在 \newtcolorbox 中?

为什么我不能将逗号放在 \newtcolorbox 中?

当我尝试在 mybox 环境中放置“,”时,出现错误:

!软件包 pgfkeys 错误:我不知道密钥“/tcb/FM and PM and Narrowband F M”,我将忽略它。也许您拼错了。

有没有办法在 tcolorbox 标题中放置逗号“,以便我的标题显示为:角度、FM、PM 和窄带 FM?

代码

\documentclass{article}
\usepackage[landscape]{geometry}
\usepackage[table]{xcolor}
\usepackage{mathtools}
\usepackage{multicol}
\usepackage{amssymb,amsthm}
\usepackage{lipsum}
\usepackage{minibox}
\usepackage[most]{tcolorbox}

\advance\topmargin-1in
\advance\textheight3in
\advance\textwidth3in
\advance\oddsidemargin-1.5in
\advance\evensidemargin-1.5in
\parindent0pt
\parskip2pt
\newcommand{\hr}{\centerline{\rule{3.5in}{1pt}}}

\begin{document}

\begin{multicols*}{3}

\newtcolorbox{mybox}[2][]{text width=0.97\textwidth,fontupper=\scriptsize,
fonttitle=\bfseries\sffamily\scriptsize, colbacktitle=black,enhanced,
attach boxed title to top left={yshift=-2mm,xshift=3mm},
boxed title style={sharp corners},top=3pt,bottom=2pt,
  title=#2,colback=white}

%%------------ Angle, FM and PM and Narrowband FM ---------------
\hspace{-0.2cm}
\begin{minipage}{0.31\textwidth}
    \begin{mybox}{Angle FM and PM and Narrowband FM}

\lipsum[2]

    \end{mybox}
\end{minipage}

\end{multicols*}
\end{document}

答案1

只需将带有逗号的标题再分成两个{ },否则,我认为tcolorbox还有另一个参数。

\documentclass{article}
\usepackage[landscape]{geometry}
\usepackage[table]{xcolor}
\usepackage{mathtools}
\usepackage{multicol}
\usepackage{amssymb,amsthm}
\usepackage{lipsum}
\usepackage{minibox}
\usepackage[most]{tcolorbox}

\advance\topmargin-1in
\advance\textheight3in
\advance\textwidth3in
\advance\oddsidemargin-1.5in
\advance\evensidemargin-1.5in
\parindent0pt
\parskip2pt
\newcommand{\hr}{\centerline{\rule{3.5in}{1pt}}}

\begin{document}

\begin{multicols*}{3}

\newtcolorbox{mybox}[2][]{text width=0.97\textwidth,fontupper=\scriptsize,
fonttitle=\bfseries\sffamily\scriptsize, colbacktitle=black,enhanced,
attach boxed title to top left={yshift=-2mm,xshift=3mm},
boxed title style={sharp corners},top=3pt,bottom=2pt,
  title=#2,colback=white}

%%------------ Angle, FM and PM and Narrowband FM ---------------
\hspace{-0.2cm}
\begin{minipage}{0.31\textwidth}
    \begin{mybox}{{Angle, FM and PM and Narrowband FM}}

\lipsum[2]

    \end{mybox}
\end{minipage}

\end{multicols*}
\end{document}

在此处输入图片描述

答案2

将值括起来title,这样当参数被实际标题替换时,逗号就不会被误认为是键值分隔符。

\newtcolorbox{mybox}[2][]{
  %text width=0.97\textwidth,%<--- avoid this
  fontupper=\scriptsize,
  fonttitle=\bfseries\sffamily\scriptsize,
  colbacktitle=black,
  enhanced,
  attach boxed title to top left={yshift=-2mm,xshift=3mm},
  boxed title style={sharp corners},
  top=3pt,
  bottom=2pt,
  title={#2},% <------ Braces!
  colback=white
}

完整示例。我建议避免设置text width,这样它将自动计算。我加载lipsumshowframe只是为了展示效果。

\documentclass{article}
\usepackage[many]{tcolorbox}

\usepackage{lipsum,showframe}

\newtcolorbox{mybox}[2][]{
  fontupper=\scriptsize,
  fonttitle=\bfseries\sffamily\scriptsize,
  colbacktitle=black,
  enhanced,
  attach boxed title to top left={yshift=-2mm,xshift=3mm},
  boxed title style={sharp corners},
  top=3pt,
  bottom=2pt,
  title={#2},
  colback=white
}

\begin{document}

%%------------ Angle, FM and PM and Narrowband FM ---------------
\begin{mybox}{Angle, FM and PM and Narrowband FM}
\lipsum*[2]
\end{mybox}

\end{document}

在此处输入图片描述

答案3

如果您编写\tcolorbox[title=Angle, FM, and PM and Narrowband FM,colback=white],当\tcolorbox解析其括号内的参数时,它会查找逗号来分隔选项。它无法知道您FM仍打算将其作为标题的一部分,而是colback将其作为单独的选项。您需要隐藏括号组内的非选项分隔逗号:\tcolorbox[title={Angle, FM, and PM and Narrowband FM},colback=white]。在将参数传递给命令之前会解析括号组,因此tcolorbox在方括号内看到的是t, i, t, l, e, =, {Angle, FM, and PM and Narrowband FM} ,, ,c ,o ,l`, … 将选项的整个参数放在括号内总是可以的。

同样适用于newtcolorbox,但有一个问题,即#2命令参数的扩展发生在参数解析之前。 周围没有隐式组#2,因此要处理任意参数,您需要添加括号。

\newtcolorbox{我的盒子}[2][]{
  文本宽度=0.97\textwidth,
  fontupper=\scriptsize,
  fonttitle=\bfseries\sffamily\scriptsize,
  colbacktitle=黑色,
  增强,
  将盒装标题附加到左上角={yshift=-2mm,xshift=3mm},
  盒装标题样式={尖角},
  顶部=3pt,底部=2pt,
  标题={#2}
  colback=白色
}

attach boxed title to top left请注意,出于同样的原因,参数使用括号。

括号应该围绕title选项的整个参数,而不是专门围绕命令的参数。例如,如果你想为所有标题添加一个通用前缀,你应该写

  title={Joe's tips: #2},

在这个特殊情况下不会有任何区别,但有时括号会对间距或一些在本地定义宏的命令的操作产生微妙的影响。选项的参数变成了深藏在底层的括号组,因此在其周围加上括号不会改变任何东西,而在上面构建额外的括号组部分的争论可以改变事情。

同样的原则通常适用于许多命令。这是低级 TeX 的事情。

相关内容