如何根据选择的标签进行多次编译?

如何根据选择的标签进行多次编译?

我想做以下事情,但我不知道该怎么做。

假设我有一个 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

相关内容