我正在研究如何设置一个包含多个文件的项目,其中多个文件可以声明要包含在主 tex 文档不同部分中的内容。之后此问答,我决定跟collect
团去。
但是,如果我包含的文本有任何verbatim
或内容,lstlisting
则comment
编译失败。
举个例子,根据 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}
生成的文档: