如何在示例框中切换解决方案,但保留要使用的空间

如何在示例框中切换解决方案,但保留要使用的空间

下面有一个 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}

相关内容