使用 collect 收集列表、评论或逐字内容

使用 collect 收集列表、评论或逐字内容

我正在研究如何设置一个包含多个文件的项目,其中多个文件可以声明要包含在主 tex 文档不同部分中的内容。之后此问答,我决定跟collect团去。

但是,如果我包含的文本有任何verbatim或内容,lstlistingcomment编译失败。

举个例子,根据 Gonzalo Medina 在上一个问题中提供的回答:

首先,声明将收集子文件内容的环境:

\usepackage{collect}

\definecollection{notes}
\definecollection{examples}

\makeatletter
\newenvironment{note}
  {\@nameuse{collect}{notes}{\par\noindent}{\par}{}{}}
  {\@nameuse{endcollect}}
\newenvironment{example}
  {\@nameuse{collect}{examples}{\par\noindent}{\par}{}{}}
  {\@nameuse{endcollect}}
\makeatother

在文件a.tex和中b.tex,将提供主文件的内容:

文件a.tex

\begin{note}
First note in file \texttt{a.tex}.
\end{note}

\begin{note}
Second note in file \texttt{a.tex}.
\begin{comment}
Hidden note in file \texttt{a.tex}.
\end{comment}
\end{note}

\begin{example}
\begin{lstlisting}
Code example with listings in file \texttt{a.tex}.
\end{lstlisting}
\end{example}

\begin{example}
\begin{verbatim}
Code example in verbatim in file \texttt{a.tex}.
\end{verbatim}
\end{example}

文件b.tex

\begin{note}
First note in file \texttt{b.tex}.
\end{note}

\begin{note}
Second note in file \texttt{b.tex}.
\begin{comment}
Hidden note in file \texttt{b.tex}.
\end{comment}
\end{note}

\begin{example}
\begin{lstlisting}
Code example with listings in file \texttt{b.tex}.
\end{lstlisting}
\end{example}

\begin{example}
\begin{verbatim}
Code example in verbatim in file \texttt{b.tex}.
\end{verbatim}
\end{example}

然后,主文档包含两个文件并首先呈现notes集合,然后呈现examples集合:

文件document.tex

\documentclass{article}
\usepackage{collect}
\usepackage{listings}
\usepackage{verbatim}
\usepackage{comment}

\definecollection{notes}
\definecollection{examples}

\makeatletter
\newenvironment{note}
  {\@nameuse{collect}{notes}{\par\noindent}{\par}{}{}}
  {\@nameuse{endcollect}}
\newenvironment{example}
  {\@nameuse{collect}{examples}{\par\noindent}{\par}{}{}}
  {\@nameuse{endcollect}}
\makeatother

\input{a}\input{b}

\begin{document}

\section{Notes}
\includecollection{notes}

\section{Examples}
\includecollection{examples}

\end{document}

所以结果应该是:

Notes

First note in file a.tex
Second note in file a.tex
First note in file b.tex
Second note in file b.tex

Examples

Code example with listings in file a.tex
Code example with verbatim in file a.tex
Code example with listings in file b.tex
Code example with verbatim in file b.tex

答案1

我找到了一个解决方案,但它需要一些额外的工作:这个想法是将特殊内容装箱。对于verbatim或的情况lstlisting,将内容装箱就足够了(例如lrbox,使用 );对于注释的情况,您可以定义一个\specialcomment先将其内容装箱的 。一个例子:

文件文档.tex

\documentclass{article}
\usepackage{comment}
\usepackage{listings}
\usepackage{collect}

\definecollection{notes}
\definecollection{examples}

\includecomment{test}

\makeatletter
\newenvironment{note}
  {\@nameuse{collect}{notes}{\par\noindent}{\par}{}{}}
  {\@nameuse{endcollect}}
\newenvironment{example}
  {\@nameuse{collect}{examples}{\par\noindent}{\par}{}{}}
  {\@nameuse{endcollect}}
\makeatother

\begin{document}
\input{a}

\section{Notes}
\includecollection{notes}

\section{Examples}
\includecollection{examples}

\end{document}

文件 a.tex (包含列表和注释):

\newsavebox\myboxa
\begin{lrbox}{\myboxa}
\begin{lstlisting}
test listing
%&/(%$#_^
\end{lstlisting}
\end{lrbox}

\newsavebox\myboxb
\specialcomment{test}{\begin{lrbox}{\myboxb}}{\end{lrbox}}
\begin{test}
Some comment in the file \texttt{a.tex}.
\end{test}

\begin{note}
First note in file \texttt{a.tex}.
\end{note}

\begin{note}
Second note in file \texttt{a.tex}.
\end{note}

\begin{note}
Third note in file \texttt{a.tex}.
\end{note}

\begin{example}
First example in file \texttt{a.tex}.
\end{example}

\begin{example}
Second example in file \texttt{a.tex}.
\end{example}

\begin{note}
\usebox\myboxb
\end{note}

\begin{example}
\usebox\myboxa
\end{example}

生成的文档:

在此处输入图片描述

相关内容