问题 1

问题 1

以下 MWE 构建了 的栅格框tcolorbox

这些代码有两个问题:

  1. 盒子并不排成一线,而是排在不同的行中。
  2. 框中的第二行#2未填充。

详情请参阅附图。

有人能帮我解决上述两个问题吗?谢谢。

梅威瑟:

\documentclass[a4paper,12pt,landscape]{article}
\usepackage{tcolorbox}
\tcbuselibrary{raster}

\begin{document}
\newcommand{\myset}[1]{
  \def\columns{#1}
}

\tcbset{a/.style={
    code={\myset{#1}},
    raster multicolumn=\columns,
  }}

\begin{tcbitemize}[title=\#\thetcbrasternum,raster columns=4,raster equal height=rows,raster width=\linewidth]
  \tcbitem 1
  \tcbitem[%
  code={\myset{3}},%
  raster multicolumn=\columns,
  ]
  \begin{tcbitemize}[raster columns=\columns]
    \tcbitem columns now is: \columns \tcbitem 1\tcbitem 1
    \tcbitem[a=2] columns now is: \columns \tcbitem 2 
  \tcbitem columns now is: \columns
  \end{tcbitemize}
  \tcbitem 3
\end{tcbitemize}

\end{document} 

在此处输入图片描述

答案1

问题 1

您需要更换:

\newcommand{\myset}[1]{
  \def\columns{#1}
}

和:

\newcommand{\myset}[1]{%
  \def\columns{#1}%
}

参数中的代码/tcb/code未传递给\pgfkeys,而是在 LaTeX 文档的正文中使用。空格很重要,显然会阻止tcolorbox看到此处紧随其后的内容tcolorbox

问题 2

在几个地方,您使用诸如raster columns=\columns或 之类的代码raster multicolumn=\columns。这很危险,因为您不知道底层代码是否会存储控制序列标记\columns,或者(可能)会扩展它并(希望)存储此扩展的结果。这就是导致您的第二个问题的原因。当a=2从 运行时\tcbitem[a=2],这会修改\columns,这会修改存储照原样由之前发布的raster columns=\columns。我建议使用pgfkeys .expand once处理程序来扩展\columns 将结果传递给raster columns或其他tcolorbox键,例如:

raster columns/.expand once=\columns

或者

raster columns/.expand once={\columns}

工作代码

\documentclass[a4paper,12pt]{article}
\usepackage[landscape, hmargin=3cm]{geometry} % example
\usepackage{tcolorbox}
\tcbuselibrary{raster}

\newcommand{\myset}[1]{%
  \def\columns{#1}%
}

\tcbset{a/.style={
    code={\myset{#1}},
    raster multicolumn/.expand once=\columns,
  }}

\begin{document}

\begin{tcbitemize}[title=\#\thetcbrasternum, raster columns=4,
                   raster equal height=rows, raster width=\linewidth]
  \tcbitem 1
  \tcbitem[code={\myset{3}}, raster multicolumn/.expand once=\columns]
    \begin{tcbitemize}[raster columns/.expand once=\columns]
      \tcbitem columns now is: \columns \tcbitem 1\tcbitem 1
      \tcbitem[a=2] columns now is: \columns \tcbitem 2
      \tcbitem columns now is: \columns
    \end{tcbitemize}
  \tcbitem 3
\end{tcbitemize}

\end{document}

截屏

笔记

当然,如果\columns在后续代码中不需要,您可以直接传递值,以更直接的方式避免问题 2 的出现:

\tcbset{a/.style={raster multicolumn={#1}, whatever else...}}

相关内容