抱歉我的英语不好。我想让页面的答案部分不可见但占用空间。我使用 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
,我们可以获取 的高度。然后我们只需应用\vskip
push 这个高度即可。
这不会在多个页面上留出空间(尽管我做了类似的回答这里可以)。它还可以与逐字命令一起使用,例如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}