我想做以下事情,但我不知道该怎么做。
假设我有一个 LaTeX 文件,里面有一系列注释,每个注释都有零个或多个“标签”(例如,关于注释的内容或与注释相关的项目)以及注释的日期。我希望能够以两种方式编译同一个文件:
- 完整地记录下来,并按时间顺序标注注释,注明日期,作为一种日志;
- 仅包括与一个或多个给定标签(带或不带日期)有关的注释,作为对这些标签所引用的项目的调查。
您认为它可以用一种不太复杂的方法来完成吗?
答案1
“不太复杂”是旁观者的看法。
话虽如此:这是一种创建“注释”文件的粗略方法,每个注释可以有一个或多个标签,并根据它们的标签打印部分或全部。这不会帮助您按日期对它们进行排序;它要求它们已经按日期排序,而您只想根据它们的标记方式挑选出其中的某些。
我们定义了一个“注释”环境,它接受一个可选参数。该参数(如果出现)应该是标签列表,以逗号分隔,没有空格。我们还定义了一个命令,\annotationdate
它接受一个参数并以粗体右对齐打印该参数;您可以将其设置为每个注释的第一行。例如,您可以有
\begin{annotation}[coding,counting]
\annotationdate{February 1, 2011}
Some remarks relevant to coding and also to counting.
\end{annotation}
我们还定义命令\printtagged
和\printall
:
要打印所有带有标签“coding”的注释,您可以
\printtagged{coding}
在文件开头输入命令。\printall
要打印所有注释(无论是否标记),您都可以在文件开头输入命令。
这是一个完整的乳胶文件,它在序言中(在和之间\makeatletter
)定义了所有这些内容\makeatother
,然后演示了这些内容的用法。
\documentclass{article}
%--------------------------------------------------------------------
%--------------------------------------------------------------------
\makeatletter
\newif\if@print
\@printfalse
\newcommand{\printall}{\@printtrue}
\newcommand\annotationdate[1]{%
\begin{flushright}
\textbf{#1}
\end{flushright}
\medskip
}
\newenvironment{annotation}[1][]%
{%
\@readtags{#1}%
\if@print
\else
\setbox0=\vbox\bgroup\color@begingroup
\fi
}{%
\if@print
\else
\color@endgroup\egroup
\fi
}%
% To print the annotations tagged with ``tag'',
% give the command \printtagged{tag}
\newcommand{\printtagged}[1]{%
\expandafter\def\csname tag@@#1\endcsname{\@printtrue}%
}
\newcommand{\@readtags}[1]{%
\def\@tmp{#1}%
\@dotags
}
\def\@dotags{%
\expandafter\onetag \@tmp,@@tagfence%
\next@dotags
}
\def\onetag#1,#2@@tagfence{%
\def\tmp{#1}%
\ifx\tmp\@empty
\let\next@dotags=\relax
\else
\csname tag@@#1\endcsname
\def\@tmp{#2}%
\let\next@dotags=\@dotags
\fi
}
\makeatother
%--------------------------------------------------------------------
%--------------------------------------------------------------------
%--------------------------------------------------------------------
\begin{document}
\begin{center}
\textbf{\large The Annotations}
\end{center}
\printtagged{hoho}
\printtagged{haha}
%\printall
\begin{annotation}[haha]
\annotationdate{April 18, 1775}
This is the first annotation. It was tagged with ``haha''.
\end{annotation}
\begin{annotation}[haha,hoho]
\annotationdate{July 4, 1776} This is the second annotation. It was
tagged with both ``haha'' and ``hoho''.
\end{annotation}
\begin{annotation}[hehe]
\annotationdate{July 4, 1776}
This is the third annotation. It was tagged with ``hehe''.
\end{annotation}
\begin{annotation}
\annotationdate{July 4, 1776}
This is the fourth annotation. It wasn't tagged at all.
\end{annotation}
\end{document}
答案2
在 ConTeXt 中,这种条件处理是使用模式本质上,Phil Hirschhorn 的解决方案是重新实现\startmode