我正在寻找一个三列布局,其中两列包含两个单独的列表,第三列是两个列表的摘要。
我的印象是,在 LaTeX 中没有“本机”方法可以做到这一点(并且没有找到可以解决问题的包),因此在第一步中,我准备了一个自定义环境和一个自定义项目输入宏:
\documentclass{scrbook}
\usepackage{multicol}
\newenvironment{MyList}[1]{
\subsection{#1}
\begin{enumerate}
}{
\end{enumerate}
}
\newcommand{\myEntry}[2]{\item \textbf{#1} -- #2}
\begin{document}
\begin{multicols}{3}
\begin{MyList}{ListOne}
\myEntry{OneOne}{Some text regarding item OneOne}
\myEntry{OneTwo}{Some text regarding item OneTwo}
\end{MyList}
\columnbreak
\begin{MyList}{ListTwo}
\myEntry{TwoOne}{Some text regarding item TwoOne}
\myEntry{TwoTwo}{Some text regarding item TwoTwo}
\end{MyList}
\columnbreak
\end{multicols}
\end{document}
但这还不到一半。我需要渲染宏的内容两次:一次在摘要栏,一次在单个列表栏。不仅如此,在对面的页面上我也必须这样做另一种方式(即,首先是单个列,然后是摘要列)。很明显,没有简单的替换转换可以做到这一点,并且需要一些“编程”,但我不知道如果在 LaTeX 中有一些方法可以做到这一点。
我可能可以编写一些 Perl 脚本通过预处理步骤来完成此操作,但是男生做那感觉有点黑客......
如果有是一种在 LaTeX 中执行此操作的方法,有人可以给我一些指点,告诉我应该寻找什么吗?
答案1
使用新的辅助文件执行此操作的方法如下:
\documentclass{scrbook}
\usepackage{multicol}
\newenvironment{MyList}[1]{
\addtostream{summary}{\noexpand\paragraph{#1}%
\noexpand\begin{enumerate}
}
\subsection{#1}
\begin{enumerate}
}{
\end{enumerate}
\addtostream{summary}{\noexpand\end{enumerate}}
}
\newcommand{\myEntry}[2]{%
\addtostream{summary}{\noexpand\item \noexpand\textbf{#1}}%
\item \textbf{#1} -- #2
}
\usepackage{newfile}
\newoutputstream{summary}
\newcommand\dosummary{%
\closeoutputstream{summary}
\subsection{Summary}
\input{\jobname.sum}
}
\openoutputfile{\jobname.sum}{summary}
\begin{document}
\begin{multicols}{3}
\begin{MyList}{ListOne}
\myEntry{OneOne}{Some text regarding item OneOne}
\myEntry{OneTwo}{Some text regarding item OneTwo}
\end{MyList}
\columnbreak
\begin{MyList}{ListTwo}
\myEntry{TwoOne}{Some text regarding item TwoOne}
\myEntry{TwoTwo}{Some text regarding item TwoTwo}
\end{MyList}
\columnbreak
\dosummary
\end{multicols}
\end{document}
重要的是newfile
使写入文件更加容易的包,以及\addtostream
实际将内容添加到辅助文件的命令。在将内容写入文件时,您必须小心扩展宏,因此在 s\noexpand
前面加了 s \item
。
我修改了MyList
环境和\myEntry
宏,将相关内容写入辅助文件,然后由\dosummary
宏打印出来。在这里了解有关辅助文件的更多信息。