包标记:缺少逻辑运算符 AND

包标记:缺少逻辑运算符 AND

我们想使用taggingwith包xcookybooky根据多个参数(标签)将食谱分类。期望的结果是两部分汤:

a) 汤和肉

b) 汤和蔬菜。

tagging软件包支持使用多个标签进行排序,其行为相当于OR多个标签的运算符。这将列出所有包含标签soup或 的食谱meat

我研究了包本身,但我不太了解它,无法重新定义AND在两个列表之间执行操作的新命令。

原始代码

\newcommand\usetag[1]{%
  \def\do##1{\csdef{tagged@##1}{}}%
  \docsvlist{#1}}%

如何将多个标签过滤器 ( tag1 AND tag2) 应用于标记的食谱列表?

答案1

为了实现您的目标,有必要重写的重要部分tagging.sty,因此我建议创建一个taggingx.sty包含以下内容的文件。

% Copyright 2021 Gernot Salzer
% Extension of tagging.sty v1.1.0.1 by Brent Longborough
% For the license, see tagging.sty
% ------------------------------------------------------
\ProvidesPackage{taggingx}[2021/01/11]
\RequirePackage{etoolbox,verbatim}

\newcommand\usetag[1]{%
  \def\do##1{\csdef{tagged@##1}{}}%
  \docsvlist{#1}}%
\newcommand\droptag[1]{%
  \def\do##1{\csundef{tagged@##1}{}}%
  \docsvlist{#1}}%

\newcommand\numberOfTagsToMatch[1]{\def\@numberOfTagsToMatch{#1}}
\numberOfTagsToMatch{1}
\newcounter{tagsMatched}

\newcommand{\iftagged}[3]{%
  \setcounter{tagsMatched}{1}%
  \def\do##1{%
    \ifcsname tagged@##1\endcsname
      \stepcounter{tagsMatched}%
    \fi
  }%
  \docsvlist{#1}%
  \ifnum\value{tagsMatched}>\@numberOfTagsToMatch
    \def\@tempa{#2}%
  \else
    \def\@tempa{#3}%
  \fi
  \@tempa
}
\newcommand{\tagged}[2]{\iftagged{#1}{#2}{}}
\newcommand{\untagged}[2]{\iftagged{#1}{}{#2}}

\newenvironment{taggedblock}[1]{%
  \tagged{#1}{%
    \let\comment\relax%
    \let\endcomment\relax%
  }%
  \comment\ignorespaces
}{%
  \endcomment\ignorespacesafterend
}
\newenvironment{untaggedblock}[1]{%
  \untagged{#1}{%
    \let\comment\relax
    \let\endcomment\relax
  }%
  \comment\ignorespaces
}{
  \endcomment\ignorespacesafterend
}

\DeclareOption*{\usetag{\CurrentOption}}
\ProcessOptions

原始包的此扩展添加了一个命令

\numberOfTagsToMatch{number}

指定必须匹配的标签数量。默认值为

\numberOfTagsToMatch{1}

这与原始包的行为相对应。

要同时匹配两个标签(‘and’ 连接词),定义标签并将此值设置为二。

\usetag{tag1,tag2}
\numberOfTagsToMatch{2}

例子:在以下文档中,包含所有标有soupAND 的部分meat

\documentclass{article}
\usepackage{taggingx}
\begin{document}
\usetag{soup,meat}
\numberOfTagsToMatch{2}

\begin{taggedblock}{soup,meat}
  Soup with meat.
\end{taggedblock}

\begin{taggedblock}{soup,vegetables}
  Soup with vegetables.
\end{taggedblock}

\begin{taggedblock}{soup,meat,vegetable}
  Soup with meat and vegetables.
\end{taggedblock}

\end{document}

在此处输入图片描述

相关内容