我正在创建一系列学生工作表,并希望同时创建一份教师指南。使用该multiaudience
包,创建只有教师才能看到的内容非常简单。但是,在教师版本 (IV) 中,间距与学生版本 (SV) 有很大不同,有时会让您难以找到所需的内容。(例如,SV 第 5 页的底部可以在 IV 第 8 页的顶部找到)。
因此我想将 IV 设为:
所有偶数页都是 SV 的页面(因此 SV 第 1 页将是 IV 第 2 页,SV 第 2 页将是 IV 第 4 页,等等),并且
所有奇数页将包含与相关偶数页内容相关的注释。(例如,IV 第 3 页将包含 IV 第 2 页的注释...即 SV 第 1 页。)
只要注释非常简单,我创建了一些代码就可以实现这一点。但如果注释中包含任何数学或格式,事情就会出错。因此,除了上述两个需求之外,我还希望:
- 讲师笔记应该能够包含图形、表格和数学,并遵循基本的格式命令。
我可以尽力保证笔记不超过一页。
这是我用于处理小事情的代码:它将笔记写入外部文件,在发货时再读回。(我multiaudience
在这里不使用它,因为我试图正确地记录笔记。)但它还有很多不足之处:数学没有保留,我不能使用emph
,等等,在注释中,换行符/新行很难创建。
\documentclass{article}
\usepackage{everyshi}
\newwrite\oppwrite
\immediate\openout\oppwrite=\jobname.opp
\newcommand{\comments}[1]{%
\immediate\write\oppwrite{#1}%
\immediate\write\oppwrite{}%
\AtNextShipout{\immediate\closeout\oppwrite%
\clearpage%
\input{\jobname.opp}%
\clearpage%
\immediate\openout\oppwrite=\jobname.opp%
}
}
\begin{document}
\begin{enumerate}
\item First item. \comments{First comment}
\item Second \comments{Second comment}
\end{enumerate}
Here is content. \comments{This is a long comment with line breaks.
Be careful with these. And $x^2$}
\end{document}
答案1
您可以使用插入,这是 TeX 内置的系统,主要用于脚注和浮动。
首先,您必须使用 分配一个新的插入\newinsert
。我们将其称为\instructornoteinsert
:
\newinsert\instructornoteinsert
\skip\instructornoteinsert=0pt
\count\instructornoteinsert=0
\AtBeginDocument{\dimen\instructornoteinsert=\vsize}
跳过意味着您不必在每页使用注释时都预留空间。此外,该\count
值0
表示添加注释不会影响页面上其他内容的可用空间,因为注释位于独立的页面上。最后,确保\dimen
注释页面不会过满。如果添加的注释过多,它们会溢出到下一页。注意:在文档末尾,如果注释页面放不下,您可能会丢失注释。
现在我们修补输出例程:
\makeatletter
\output\expandafter{\the\output
\ifodd\value{page}\else
\setbox\@outputbox\vbox to\vsize{\unvbox\instructornoteinsert\vfil}%
\@outputpage
\fi
}
在正常输出例程之后,我们检查是否真的有新页面(那么页面将有偶数)。然后\@outputbox
创建一个新页面,其中包含\instructornoteinsert
在页面中添加的所有注释。(它们在框中可用\instructornoteinsert
)最后我们使用输出此框。使用而不是直接\@outputpage
使用的优势在于页面布局由我们处理。\@outputpage
\shipout
现在我们只需要定义\comments
实际填充\instructornoteinsert
使用\insert
:
\newcommand{\comments}[1]{%
\insert\instructornoteinsert{%
\normalfont
\interlinepenalty0
\splittopskip0pt
\splitmaxdepth\dp\strutbox
\floatingpenalty0
\hsize\columnwidth
\@parboxrestore
#1%
\@finalstrut\strutbox
}%
}
\makeatother
这与 s 基本相同\footnote
。忽略字体和段落设置以避免外部字体指令影响评论。惩罚很重要:如果惩罚较高,我们可能会影响非评论页面的布局。
完整代码:
\documentclass{article}
\newinsert\instructornoteinsert
\skip\instructornoteinsert=0pt
\AtBeginDocument{\dimen\instructornoteinsert=\vsize}
\count\instructornoteinsert=0
\showboxdepth=\maxdimen
\showboxbreadth=\maxdimen
\makeatletter
\output\expandafter{\the\output
\ifodd\value{page}\else
\setbox\@outputbox\vbox to\vsize{\unvbox\instructornoteinsert\vfil}%
\@outputpage
\fi
}
\newcommand{\comments}[1]{%
\insert\instructornoteinsert{%
\normalfont
\interlinepenalty0
\splittopskip0pt
\splitmaxdepth\dp\strutbox
\floatingpenalty0
\hsize\columnwidth
\@parboxrestore
#1%
\@finalstrut\strutbox
}%
}
\makeatother
\begin{document}
\begin{enumerate}
\item First item. \comments{First comment}
\item Second \comments{Second comment}
\end{enumerate}
Here is content. \comments{This is a long comment with line breaks.
Be careful with these. And $x^2$}
\end{document}