创建文档的填空版本,并可以打开或关闭空白

创建文档的填空版本,并可以打开或关闭空白

我正在准备一些讲义/幻灯片,并希望有效地创建两个版本的输出:一个是我自己的完整版本,另一个是给我的学生的版本,其中某些文本用空白或空框替换,以便他们可以在讲座期间填写。

\underline{\phantom{text}}命令可以达到目的,但创建文档的单独版本并将其插入所有相关位置会很耗时。

如何使用宏让我们能够轻松地在教师版本(全文)和学生版本(空白)之间切换?

我本来想将此作为问题发布,但后来明白了,所以想与大家分享一下。

答案1

包将使用和命令censor来换行。前者将显示单词间空格。后者则不会。\blackout\xblackout

默认情况下,“涂黑”是一条粗线\rule。为了使其成为下划线(使用 3.21 版censor,日期为 2013 年 7 月 30 日),我重置了\censorruledepth和 的参数\censorruleheight

\documentclass{article}
\usepackage{censor}
\censorruledepth=-.2ex
\censorruleheight=.1ex
%\StopCensoring
\begin{document}
An the answer is \xblackout{forty two}.

The beginning six words of the Gettysburg Address are \blackout{Four score and seven years ago}.
\end{document}

在此处输入图片描述

取消注释该\StopCensoring命令将使文本重新回到文档中,IE,创建教师副本。

censor已编辑以反映 V3.21 (错误修复)的可用性http://ctan.org/tex-archive/macros/latex/contrib/censor

答案2

创建一个具有两个版本的宏\doBlank:一个用带下划线的空白替换参数,另一个保持参数不变。然后,要在文档版本之间切换,我们只需注释掉一个定义或另一个定义:

以下是老师的版本:

\documentclass[a4paper,12pt]{article}

%\newcommand{\doBlank}[1]{\underline{\phantom{#1}}}
\newcommand{\doBlank}[1]{#1}

\begin{document}

The last five words \doBlank{are replaced by a blank}.

\end{document}

以下是学生的版本:

\documentclass[a4paper,12pt]{article}

\newcommand{\doBlank}[1]{\underline{\phantom{#1}}}
%\newcommand{\doBlank}[1]{#1}

\begin{document}

The last five words \doBlank{are replaced by a blank}.

\end{document}

答案3

我和我的同事从包中改编了这段代码eqexam,并将其用于考试中的填空题:

\newcommand{\fillin}[3][u]{  
%% #1= the box (u=underlined, e=empty, b=boxed) #2= space for the  
%% answer, #3= the correct answer  
\space  
    \ifx#1u\let\fillin@Fmt=\underbar%%% by default underlined space  
    \else\ifx#1e\let\fillin@Fmt=\relax%%% empty space  
    \else\ifx#1b\let\fillin@Fmt=\fbox%%% box  
    \fi\fi\fi  
     \fillin@Fmt{\parbox[b][.8\height][b]{#2}{%  
            \strut\hfil\fill@ans@color{#3}\hfil}%  
 }  
 }

我们尝试过将答案的文本拆分成多行,但不起作用。由于您可以在此命令中定义空白的长度,因此需要手动填充较大空间的问题应该可以解决。

我们会考虑跨行拆分文本的可能性,如果找到解决方案,我们会发布解决方案。

编辑

我之前的回答中缺少部分代码。抱歉。

以下是包含完整代码的 mwe:

\documentclass{article}  
\usepackage{calc} 

\newif \ifteacher  

\makeatletter  
    \ifteacher  
    \teachertrue  
    %\teacherfalse
    \def\fill@ans@color#1{\bfseries\color{red}{#1}}%%% with solutions  
    answers are in red by default  
    \else  
    \def\fill@ans@color#1{\phantom{#1}}%%% without solutions option -> no  
    answers
    \fi  

\newcommand{\fillin}[3][u]{  
%% #1= the box (u=underlined, e=empty, b=boxed) #2= space for the  
%% answer, #3= the correct answer  
\space  
    \ifx#1u\let\fillin@Fmt=\underbar%%% by default underlined space  
    \else\ifx#1e\let\fillin@Fmt=\relax%%% empty space  
    \else\ifx#1b\let\fillin@Fmt=\fbox%%% box  
    \fi\fi\fi  
    \fillin@Fmt{\parbox[b][.8\height][b]{#2}{%  
        \strut\hfil\fill@ans@color{#3}\hfil}%  
 }  
 }  
\makeatother  

\begin{document}  


2+4=\fillin{4cm}{6}  
\end{document}

如果您想要教师版本,则必须取消注释 \teachertrue 命令;如果您想要学生版本,则必须取消注释另一个命令。

编辑2

必须在前言中放入开关 \teachertrue 或 \teacherfalse。上面的代码现在应该可以工作了。

答案4

回答有关fr.comp.text.tex(见讨论结尾),Paul Isambert 使用LuaTeX机器编写了一些代码(代码链接现已损坏)。当时,我们通过电子邮件私下讨论了此事,Paul 增强了他的代码以满足我的需求。他给了我许可发布结果代码(PAT = 'poly à trous',代码以法语注释,请随意分叉和/或提交)。

从我的角度来看,真正有趣的一点是它避免了行首的“孤立”空白:如果行首的空白太小,则会被丢弃。它也足够强大,可以处理数学、文本以及两者的混合。

这是如何attributes使用来进行一些“后期处理”的一个很好的例子LuaTeX

\documentclass{article}

\usepackage{PAT,pgffor}

\def\test#1{%
  \foreach \i in {1,...,#1}{%
    test }}

\begin{document}

Test \trou{Test} Test

Test \trou{\test{20}} Test

Test \trou{$\displaystyle\int$ Test} Test

Test $\displaystyle \trou{\int_{0}^{t^2} x^2 dx}$ Test

Test $$\int_{0}^{\trou{t^{2}}} \frac{x^2}{\trou{2}} dx$$ Test

Test \trou{abc \par def} Test

\end{document}

在此处输入图片描述

相关内容