我正在写一本书长度的文档,偶尔我会想在结尾处自动重复一些文字。例如,
\begin{important_thing}
\medskip
{\bf Lorem Ipsum Principle.} Blah blah blah.
\end{important_thing}
此文本应显示在文档中,就像\begin
和\end
行不存在一样。此外,我希望所有“重要内容”按照它们出现的顺序再次出现在文档末尾。
我觉得应该可以定义一些宏来自动处理这个问题,但我不知道该怎么做。(我可以定义一个由我的 Lorem Ipsum 原则组成的宏,然后引用它两次——这接近我的要求,尽管如果我重新排列文档中的内容,那么我必须在最后手动重新排列它们。)我的要求是不是太多了?
答案1
与我的回答相比,变化很小在最后收集文档中使用的所有 \TODO 命令的输入。我之所以称其为“交叉引用”,只是因为这是你问题中的一个标签。你可以随意称呼它。
宏版本稍后请参阅环境版本。
\documentclass{article}
\usepackage{ifthen}
\newcounter{crossrefindex}
\setcounter{crossrefindex}{0}
\newcommand\CROSSREF[1]{%
\addtocounter{crossrefindex}{1}%
\expandafter\def\csname crossref\roman{crossrefindex}\endcsname{#1}%
#1%
}
\newcounter{index}
\newcommand\showCROSSREFs{%
\vspace{5ex}%
\rule{10ex}{.5ex}CROSS-REF LIST\rule{10ex}{.5ex}\\%
\setcounter{index}{0}%
\whiledo{\value{index} < \value{crossrefindex}}{%
\addtocounter{index}{1}%
\arabic{index}): \csname crossref\roman{index}\endcsname\\%
}%
}
\begin{document}
I start hear \CROSSREF{Fix this bug} and do some work.
Then I do thiis \CROSSREF{Get spelling fixed, too} which I have to get back
to
and then I am done
\showCROSSREFs
\end{document}
环境版本
不幸的是,这会占用环境后的空间,因此{}
如果想保留它,必须在环境后添加一个明确的空间。
\documentclass{article}
\usepackage{ifthen,environ,etoolbox}
\newcounter{crossrefindex}
\setcounter{crossrefindex}{0}
\makeatletter
\NewEnviron{CROSSREF}{%
\addtocounter{crossrefindex}{1}%
\expandafter\xdef\csname crossref\romannumeral\value{crossrefindex}\endcsname{%
\expandonce{\BODY}}%
\BODY%
}
\makeatother
\newcounter{index}
\newcommand\showCROSSREFs{%
\vspace{5ex}%
\rule{10ex}{.5ex}CROSS-REF LIST\rule{10ex}{.5ex}\\%
\setcounter{index}{0}%
\whiledo{\value{index} < \value{crossrefindex}}{%
\addtocounter{index}{1}%
\arabic{index}): \csname crossref\romannumeral\value{index}\endcsname\\%
}%
}
\begin{document}
I start hear \begin{CROSSREF}Fix this bug\end{CROSSREF}{} and do some work.
Then I do thiis \begin{CROSSREF}Get spelling fixed, too\end{CROSSREF}{} which I have to get back
to
and then I am done
\showCROSSREFs
\end{document}
答案2
可能有几种变化,但这只是一个开始。
\documentclass{article}
\usepackage{environ}
\usepackage{lipsum} % just for the example
\newcounter{repeatatend}
\makeatletter
\def\repeat@at@end{} % initialize
\NewEnviron{important}{%
\par
\medskip
\BODY\par
\medskip
\refstepcounter{repeatatend}%
\label{repeatatend@\romannumeral\value{repeatatend}}%
\xdef\repeat@at@end{%
\unexpanded\expandafter{\repeat@at@end}%
\unexpanded{\noindent(p.~\pageref}{repeatatend@\romannumeral\value{repeatatend}}) %
\unexpanded\expandafter{\BODY\par}%
}%
}
\AtEndDocument{\section*{Important}\repeat@at@end}
\begin{document}
Here I state something very important
\begin{important}
\textbf{Lorem Ipsum Principle.} Blah blah blah.
\end{important}
\lipsum % to get to another page
Then another important thing
\begin{important}
Ducks can fly.
\end{important}
which is something to take into account.
And then I am done.
\end{document}
这是第 1 页的相关部分
以下是最后发生的事情
答案3
大师@egreg 给出的答案的变体,由包提供逐字支持:)scontents
。
\documentclass{article}
\usepackage[print-env=true,store-env=important]{scontents}
\setlength{\parindent}{0pt}
\pagestyle{empty}
% Uncomment this to automatic repeat ...thanks @egreg :)
%\AtEndDocument{\section*{Important}
%\begin{enumerate}
%\foreachsc[before={\item }]{important}
%\end{enumerate}}
\begin{document}
\section{Important things}
Here I state something very important
\begin{scontents}
\textbf{Lorem Ipsum Principle.} Blah blah blah.
\end{scontents}
Here I state something very important
\begin{scontents}
\textbf{Lorem Ipsum Principle.} Tick Tack Tack.
\end{scontents}
Then another important thing
\begin{scontents}
\verb*|Ducks can fly?|.
\end{scontents}
\section{Repeat manually}
\getstored[1]{important}\\[10pt]
\getstored[2]{important}\\[10pt]
\getstored[3]{important}
\section{Repeat all}
\begin{enumerate}
\foreachsc[before={\item }]{important}
\end{enumerate}
\end{document}