选项 1:取消一切并使用盒子进行测量

选项 1:取消一切并使用盒子进行测量

抱歉我的英语不好。我想让页面的答案部分不可见但占用空间。我使用 xetex。

\documentclass{book}
\usepackage{lipsum}
\newcommand{\question}[1]{#1}
\newcommand{\answer}[1]{#1}
\begin{document}
    \question{What is your idea?}
    \answer{\lipsum[1]}
    \lipsum[2]
\end{document}

输出: 在此处输入图片描述 在上面的代码中我想1不可见。像这样 在此处输入图片描述 不幸的是,透明包在 xetex 中不起作用,因为答案部分可能是 tikz 或 colorbox 或其他东西,所以在某些情况下将答案部分的颜色更改为白色并不能解决问题。提前致谢

答案1

选项 1:取消一切并使用盒子进行测量

如果你想让任何东西(任何盒子)隐形,你可以

  • 用环境包装事物
  • 将内容捕获到你从未排版过的框中(只需测量)
  • 测量盒子的高度,
  • 添加相同数量的垂直跳跃

由于跳行问题,输出可能与可见版本不完全相同,但应该在合理的误差范围内。

代码

\documentclass{book}
\usepackage{lipsum}
\usepackage{xcolor}
\usepackage{environ,varwidth}
\newcommand{\question}[1]{#1}

\newcounter{showsolutions}
\setcounter{showsolutions}{0}% 0=False 1=True

\newsavebox{\hidebox}
\NewEnviron{answer}{\savebox{\hidebox}{\begin{varwidth}{\linewidth}\BODY\end{varwidth}}\ifnum\value{showsolutions}=0\relax\par\vspace{\the\dimexpr\ht\hidebox+\dp\hidebox}\else\BODY\fi}%

\begin{document}
  \question{What is your idea?}
  \begin{answer}
  \lipsum[1]
  \end{answer}
  \lipsum[2]
\end{document}

选项 2:使文本变白

对于纯文本解决方案

如果

  • 你想隐藏的只是文字,
  • 您希望文本占用与正常情况下相同的空间
  • 应该与 xelatex 一起工作

将黑色换成白色应该可以达到你想要的效果。

\documentclass{book}
\usepackage{lipsum}
\usepackage{xcolor}
\newcommand{\question}[1]{#1}
\newcommand{\answer}[1]{\begingroup\color{white}#1\endgroup}
\begin{document}
  \question{What is your idea?}
  \answer{\lipsum[1]}
  \lipsum[2]
\end{document}

在此处输入图片描述

另一种方法可能是查看 xetex 文档,特别是在字体选项下。您可以定义。

在此处输入图片描述

答案2

最直接的解决方案是使用adjustbox包并定义答案命令如下:

 \newcommand{\answer}[1]{\adjustbox{minipage=linewidth,phantom,frame}{#1}}

phantom在应该显示答案时删除选项。当然,这frame是为了演示目的,可能必须删除。

编辑:我刚刚在评论中看到,开关必须作为参数给出,因此\answer可以定义为:

\newcommand\answer[2][phantom]{\adjustbox{minipage=\textwidth,frame,#1}{#2}}

带有一个可选参数,默认设置为phantom隐藏内容,而简单省略则显示它。

尽管如此,作为一名教师,我发现更方便的是全球的改变,例如\newif使用下面这个简单的方法。

\documentclass{book}
\usepackage{lipsum}
\usepackage{tikz}
\usepackage{adjustbox}
\newcommand{\question}[1]{#1\par}

\newif\ifhideanswer

\newcommand\answer[1]{%
\ifhideanswer
\adjustbox{minipage=\textwidth,phantom}{#1}
\else
\adjustbox{minipage=\linewidth}{#1}
\fi
}

\begin{document}
\hideanswerfalse
\question{What is your idea?}
\answer{%
\tikz{\draw[fill=red,line width=1pt]  circle(1ex);} 
\lipsum[1]
}
\lipsum[2]

\rule{\textwidth}{1pt}  \bigskip

\hideanswertrue
\question{What is your idea?}
\answer{
\tikz{\draw[fill=red,line width=1pt]  circle(1ex);} 
\lipsum[1]
}
\lipsum[2]

\end{document}

制作所附图片。 在此处输入图片描述

答案3

您可以使用盒子来确保高度合适。即内容的实际高度。差不多。

通过定义\ProcessCutFile为空,那么comment包将不会执行任何操作(一切都在文档)。此外,我们可以使用\CommentCutFile将环境的内容放入 中\box,我们可以获取 的高度。然后我们只需应用\vskippush 这个高度即可。

这不会在多个页面上留出空间(尽管我做了类似的回答这里可以)。它还可以与逐字命令一起使用,例如listings

\documentclass{article}
\usepackage{comment}
\usepackage{lipsum}
\usepackage{tikz}
% Make ourselves a new conditional
% Use \HideSolutionstrue to "activate" it
\newif\ifHideSolutions
% Make a solution environment
\generalcomment{solution}{%
  \begingroup
  \ifHideSolutions%
  % if \HideSolutionstrue is not called, then we remove the contents
  \def\ProcessCutFile{}\fi%
}{%
  \ifHideSolutions%
    % aand,now (also when it's not called), we make a box
    % and then we \input the \CommentCutFile.
    \setbox1=\vbox{\input{\CommentCutFile}}%
    % Get the height from \ht1 and use \vskip to make appropriate space
    \vskip\ht1
  \fi
\endgroup%
}

%Uncomment below to show solutions
\HideSolutionstrue

\begin{document}
  Some problem text goes here

  \begin{solution}
    \textbf{SOLUTION 1}
    \[ \forall\varepsilon>0\exists\delta>0:\dots \]
    \tikz{\draw(0,0)--(3,2);}
\end{solution}
%^ \end{solution} has to be ALONE on line without any prior spaces

  BETWEEN

\begin{solution}
    \textbf{SOLUTION 2}
    \begin{verbatim}
        This
        is
        also
        hidden
    \end{verbatim}
    \[ \forall\varepsilon>0\exists\delta>0:\dots \]
\end{solution}
%^ has to be ALONE on line without any prior spaces
  Some text after solution.

\end{document}

相关内容