
Рассмотрим следующий код:
\documentclass{article}
\usepackage{tabularx}
\usepackage{colortbl}
\usepackage{array}
\usepackage{tcolorbox}
\newtcolorbox{testbox}{
width=.5\textwidth
}
\begin{document}
% \begin{testbox} %compilation fails when this is uncommented
% \begin{tcolorbox}[tabularx={l},width=4cm]
% test1 \\\hline
% test2
% \end{tcolorbox}
% \end{testbox}
\begin{tcolorbox}[width=.5\textwidth]
\begin{tcolorbox}[tabularx={l},width=4cm]
test1 \\\hline
test2
\end{tcolorbox}
\end{tcolorbox}
\end{document}
объявленное testbox
отверстие newtcolorbox
точно такое же, как и у tcolorbox с опцией, width=.5\textwidth
добавленной вручную.
Однако, если я помещу tabularx
в последний еще один блок с опцией, он будет работать так, как и ожидалось, но если я помещу тот же блок в свой, testbox
он больше не будет компилироваться.
Есть какие-нибудь подсказки, что здесь происходит?
решение1
Причина неудачи в первом случае в том, что взлом tabularx
получает неправильное имя среды. Это имя сохраняется опцией savedelimiter
и автоматически устанавливается testbox
внешним ящиком. Для внутренних ящиков почти все опции возвращаются к значениям по умолчанию - savedelimiter
это одна из немногих опций, которая остается на текущем значении (задокументировано для reset
ключа).
Пример исправлен с помощью savedelimiter
прямого использования:
\documentclass{article}
\usepackage{tabularx}
\usepackage{colortbl}
\usepackage{array}
\usepackage{tcolorbox}
\newtcolorbox{testbox}{
width=.5\textwidth
}
\begin{document}
\begin{testbox}
\begin{tcolorbox}[tabularx={l},width=4cm,savedelimiter=tcolorbox]
test1 \\\hline
test2
\end{tcolorbox}
\end{testbox}
\begin{tcolorbox}[width=.5\textwidth]
\begin{tcolorbox}[tabularx={l},width=4cm]
test1 \\\hline
test2
\end{tcolorbox}
\end{tcolorbox}
\end{document}
Как писал Дэвид Карлайл: Вложение tabularx
— это немного сложно. Здесь мы вкладываем tabularx
внутрь внутри tcolorbox
внутри tcolorbox
...