只在偶数页打印内容,在奇数页上打印注释

只在偶数页打印内容,在奇数页上打印注释

我正在创建一系列学生工作表,并希望同时创建一份教师指南。使用该multiaudience包,创建只有教师才能看到的内容非常简单。但是,在教师版本 (IV) 中,间距与学生版本 (SV) 有很大不同,有时会让您难以找到所需的内容。(例如,SV 第 5 页的底部可以在 IV 第 8 页的顶部找到)。

因此我想将 IV 设为:

  1. 所有偶数页都是 SV 的页面(因此 SV 第 1 页将是 IV 第 2 页,SV 第 2 页将是 IV 第 4 页,等等),并且

  2. 所有奇数页将包含与相关偶数页内容相关的注释。(例如,IV 第 3 页将包含 IV 第 2 页的注释...即 SV 第 1 页。)

只要注释非常简单,我创建了一些代码就可以实现这一点。但如果注释中包含任何数学或格式,事情就会出错。因此,除了上述两个需求之外,我还希望:

  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}

跳过意味着您不必在每页使用注释时都预留空间。此外,该\count0表示添加注释不会影响页面上其他内容的可用空间,因为注释位于独立的页面上。最后,确保\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}

相关内容