我们想使用tagging
with包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}
例子:在以下文档中,包含所有标有soup
AND 的部分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}