以下 MWE 构建了 的栅格框tcolorbox
。
这些代码有两个问题:
- 盒子并不排成一线,而是排在不同的行中。
- 框中的第二行
#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...}}