如何渲染一些宏内容两次?

如何渲染一些宏内容两次?

我正在寻找一个三列布局,其中两列包含两个单独的列表,第三列是两个列表的摘要。

小样

我的印象是,在 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宏打印出来。在这里了解有关辅助文件的更多信息。

相关内容