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