我以前使用多受众包时没有遇到任何问题。但现在我有一个包含多个受众的文档,我需要同时获取两个受众的结果。我有 5 个受众,分为两类,略有不同。一种是“a,b,c”类型,另一种是“x,y”类型。我的目的是将值“a,x”定义为当前受众,并获取“a”和“x”受众的结果。
我知道我可以通过所有可能的组合来定义受众,就像这样:
\SetNewAudience{ax}
\SetNewAudience{ay}
\SetNewAudience{bx}
\SetNewAudience{by}
\SetNewAudience{cx}
\SetNewAudience{cy}
但我不想这样做,我更愿意将观众定义为正常人,并得到其中两个人的结果。
这是我所能找到的代码。我重新定义了命令 \SetNewAudience,但它不起作用。
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{multiaudience}
\usepackage{xkvview}
\usepackage{xparse}
%Command provided by user31729 from: https://tex.stackexchange.com/questions/287084/membership-check-on-comma-separated-list/287085?r=SearchResults#287085
\ExplSyntaxOn
\NewDocumentCommand{\IsMember}{mm+m+m}{%
\clist_set:Nx \l_tmpa_clist {#1}
\clist_if_in:NnTF \l_tmpa_clist {#2} {#3} {#4}
}
\ExplSyntaxOff
\makeatletter
\def\showWhenAppropriate{%
\if@MULTAU@include%
\@MULTAU@showntrue%
\else%
\@MULTAU@shownfalse%
\fi%
}
\def\SetNewAudience#1{%
\define@key{MULTAU}{#1}[]{%
\def\@MULTAU@currkey{#1}%
\IsMember{\CurrentAudience}{\@MULTAU@currkey}{\showWhenAppropriate}{\relax}
}%
}
\makeatother
\DefCurrentAudience{a,x}
\SetNewAudience{a}
\SetNewAudience{b}
\SetNewAudience{c}
\SetNewAudience{x}
\SetNewAudience{y}
\begin{document}
Current audience: \CurrentAudience % for testing
\xkvview{} % for testing
\showto{a}{a}
\showto{b}{b}
\showto{c}{c}
\showto{x}{x}
\showto{y}{y}
\showto{a,x}{ax}
\showto{-,a,x}{bcy}
\end{document}
提前致谢。
答案1
我为 CTAN 提交了一个新版本,解决了这个问题。
这是新代码。如果您的版本是 1.05(即将在 CTAN 上发布)或更新版本,则无需使用此代码:
\def\SetNewAudience#1{%
\define@key{MULTAU}{#1}[]{%
\def\@MULTAU@currkey{#1}%
\@for\@tempa:=\CurrentAudience \do{%
\ifx\@MULTAU@currkey\@tempa\relax
\if@MULTAU@include
\@MULTAU@showntrue
\else
\@MULTAU@shownfalse
\fi%
\fi%
}}}
例如:( \DefCurrentAudience{ax,ay,az}
请注意观众之间没有空格)。
答案2
我刚刚遇到了同样的问题,不幸的是,多受众包似乎无法做到这一点。
我改用可选包:
\documentclass{minimal}
\usepackage[foo,bar]{optional}
\begin{document}
\opt{foo}{foo}
\opt{bar}{bar}
\opt{foo,bar}{foobar}
\end{document}