
Примите во внимание следующее:
\documentclass{article}
\usepackage[backend=bibtex8]{biblatex}
\begin{filecontents*}{bib.bib}
@mastersthesis{toto,
author={Toto},
title={My thesis},
year={2009},
school={Paris 129},
keywords={mem}
}
\end{filecontents*}
\addbibresource{bib.bib}
\newtoggle{display}
\toggletrue{display}
\begin{document}
\nocite{*}
\printbibliography[\iftoggle{display}{keyword=mem}{notkeyword=mem}]
\togglefalse{display}
\printbibliography[\iftoggle{display}{keyword=mem}{notkeyword=mem}]
\end{document}
Я ожидаю, что в зависимости от значения переключателя display
записи с ключевым словом mem
будут отображаться или нет.
Однако все, что я получаю, это ! Package keyval Error: keyword=mem undefined.
ошибки ! Package keyval Error: notkeyword=mem undefined.
.
решение1
Вам необходимо раскрыть необязательный аргумент, прежде чем \printbibliography
он будет увиден:
\begin{filecontents*}{\jobname.bib}
@mastersthesis{toto,
author={Toto},
title={My thesis},
year={2009},
school={Paris 129},
keywords={mem}
}
@mastersthesis{toto2,
author={Toto},
title={My thesis not mem},
year={2009},
school={Paris 129},
keywords={notmem}
}
\end{filecontents*}
\documentclass{article}
\usepackage[backend=bibtex8]{biblatex}
\addbibresource{\jobname.bib}
\newtoggle{display}
\toggletrue{display}
\begin{document}
\nocite{*}
\begingroup\edef\x{\endgroup\noexpand
\printbibliography[\iftoggle{display}{keyword=mem}{notkeyword=mem}]%
}\x
\togglefalse{display}
\begingroup\edef\x{\endgroup\noexpand
\printbibliography[\iftoggle{display}{keyword=mem}{notkeyword=mem}]%
}\x
\end{document}
Более удобный интерфейс можно получить с помощьюxparse
\begin{filecontents*}{\jobname.bib}
@mastersthesis{toto,
author={Toto},
title={My thesis},
year={2009},
school={Paris 129},
keywords={mem}
}
@mastersthesis{toto2,
author={Toto},
title={My thesis not mem},
year={2009},
school={Paris 129},
keywords={notmem}
}
\end{filecontents*}
\documentclass{article}
\usepackage[backend=bibtex8]{biblatex}
\usepackage{xparse}
\addbibresource{\jobname.bib}
\newtoggle{display}
\toggletrue{display}
\ExplSyntaxOn
\NewDocumentCommand{\xprintbibliography}{o}
{
\IfNoValueTF{#1}
{
\printbibliography
}
{
\clement_xprintbibliography:x { #1 }
}
}
\cs_new_protected:Npn \clement_xprintbibliography:n #1
{
\printbibliography[#1]
}
\cs_generate_variant:Nn \clement_xprintbibliography:n { x }
\ExplSyntaxOff
\begin{document}
\nocite{*}
\xprintbibliography[\iftoggle{display}{keyword=mem}{notkeyword=mem}]%
\togglefalse{display}
\xprintbibliography[\iftoggle{display}{keyword=mem}{notkeyword=mem}]%
\end{document}
решение2
По какой-то причине, которую я до сих пор не понимаю, можно просто позволить keyword
/ notkeyword
зависеть от переключателя.
Для удобства чтения я включил в текст \iftoggle{display}{keyword}{notkeyword}
новую команду ( etiquette
, что по-французски означает «метка»), но это не обязательно.
\documentclass{article}
\usepackage[backend=bibtex8, defernumbers=true]{biblatex}
\begin{filecontents*}{bib.bib}
@mastersthesis{toto1,
author={Toto},
title={My thesis},
year={2009},
school={Paris 129},
keywords={mem}
}
@mastersthesis{toto2,
author={Toto},
title={My new thesis},
year={2015},
school={Paris 32},
}
\end{filecontents*}
\addbibresource{bib.bib}
\newtoggle{display}
\toggletrue{display}
\newcommand{\etiquette}{\iftoggle{display}{keyword}{notkeyword}}
\begin{document}
\nocite{*}
\printbibliography[\etiquette=mem, title={With mem keyword}]
\togglefalse{display}
\printbibliography[\etiquette=mem, title={With\emph{out} mem keyword}]
\end{document}
Компилируется без предупреждения и выдает ожидаемый результат:
Удивительно, но все наоборот, т.е.
\newcommand{\etiquette}{\iftoggle{display}{mem}{bubu}}
...
\printbibliography[notkeyword=\etiquette, title={Without mem keyword}]
\togglefalse{display}
\printbibliography[notkeyword=\etiquette, title={Without bubu keyword}]
...
не работает (без предупреждения, но каждый раз все цитируется).