下面有一个 if 语句,用于切换某些内容是否可见。我在 tcolorbox 中使用它作为示例问题的解决方案。
我希望能够将 \ShowSoltrue 更改为 \ShowSolFalse,并且不影响 tcolourbox 的高度。也就是说,我希望它是空白的,但高度与满的一样。
有办法实现这个吗?
\documentclass[12pt]{report}
\usepackage[most]{tcolorbox}
\usepackage {lipsum}
\newtcolorbox{examplebox}[1][]{}
\newif\ifShowSol
\newcommand{\showsol}[1]{\ifShowSol #1 \fi}
\ShowSoltrue
\begin{document}
\begin{examplebox}
\textbf{Example 1.1}\\
\showsol{\lipsum[1-1]}
\end{examplebox}
\end{document}
当切换到 false 时,当前发生的情况是 - 框的高度缩小。
\documentclass[12pt]{report}
\usepackage[most]{tcolorbox}
\usepackage {lipsum}
\newtcolorbox{examplebox}[1][]{}
\newif\ifShowSol
\newcommand{\showsol}[1]{\ifShowSol #1 \fi}
\ShowSolfalse
\begin{document}
\begin{examplebox}
\textbf{Example 1.1}\\
\showsol{\lipsum[1-1]}
\end{examplebox}
\end{document}
答案1
当我开始研究这个问题时,Ignasi 的答案 (+1) 还没有出现,所以我只添加我的答案,尽管它与 Ignasi 的答案非常相似 (。主要区别在于我保留了你的想法\ifShowSol
。
\documentclass[12pt]{report}
\newif\ifShowSol
\ShowSolfalse
\usepackage{lipsum}
\usepackage[most]{tcolorbox}
\newtcolorbox{examplebox}[1][]{%
fonttitle=\bfseries,%
lowerbox=\ifShowSol visible\else invisible\fi,%
#1,%
}
\begin{document}
Solution is invisible because of \verb|\ShowSolfalse| in preamble:
\begin{examplebox}[title={Example}]
\textbf{Question:} \lipsum[1][1-3]
\tcblower
\textbf{Answer:} \lipsum[2][1-3]
\end{examplebox}
\ShowSoltrue
Solution is visible because of \verb|\ShowSolfalse| above:
\begin{examplebox}[title={Example}]
\textbf{Question:} \lipsum[3][1-3]
\tcblower
\textbf{Answer:} \lipsum[4][1-3]
\end{examplebox}
\end{document}
答案2
tcolorbox
提供upperbox=invisible
隐藏内容同时保留空间的功能。以下不是好的代码,但可以作为开始。
\documentclass[12pt]{report}
\usepackage[most]{tcolorbox}
\usepackage {lipsum}
\tcbset{visibility/.style={}}
\newtcolorbox[auto counter, number within=chapter]{examplebox}[1][]{title=Example~\thetcbcounter, visibility, #1}
\newcommand{\hidesol}{\tcbset{visibility/.style={upperbox=invisible}}}
\begin{document}
\begin{examplebox}
\lipsum[1-1]
\end{examplebox}
{\hidesol
\begin{examplebox}
\lipsum[1-1]
\end{examplebox}
}
\begin{examplebox}
\lipsum[1-1]
\end{examplebox}
\end{document}
答案3
已经有一些很好的答案,但我想补充两点:如果将可见性设置从 移动\newtcolorbox
到,\tcbset
则可以手动覆盖可见性。
另外,在我看来,您希望框的标题位于框内(而不是在顶部分开)。如果是这样,您可以将框分成上下两个框,然后将标题放在上框中或使用选项attach title to upper
。要获得正确的间距,您可以设置选项middle=0pt
。
使用这种方法,您必须通过 设置下方框的可见性lowerbox=
。
\documentclass[12pt]{report}
\usepackage[most]{tcolorbox}
\usepackage {lipsum}
\newif\ifShowSol
\ShowSolfalse
\newtcolorbox{newexamplebox}[1][]{lower separated=false, middle=0pt, fonttitle=\bfseries, coltitle=black,attach title to upper,#1}
\tcbset{lowerbox=\ifShowSol visible\else invisible\fi}
\begin{document}
\begin{newexamplebox}[title=Example 1.1, lowerbox=visible] % add , lowerbox=visible | invisible to overwrite the main visibilty setting
\tcblower
\lipsum[1-1]
\end{newexamplebox}
\begin{newexamplebox} % add [, lowerbox=visible | invisible] to overwrite the main visibilty setting
\textbf{Example 1.1}
\tcblower
\lipsum[1-1]
\end{newexamplebox}
\end{document}
您还可以通过简单地手动更改选项来摆脱 if 块\tcbset{lowerbox=visible/invisible}
。