3

title and keyword are optional arguments to the Biblatex command, printbibliography.

Is it possible to pass a title and keyword as variables to printbibliography?

The use case is the production of a complex bibliography that I would like to separate into sections based on keyword and by applying an appropriate title to that bibliography section.

This non-working example gives:

Package biblatex Warning: Keyword '\keyword ' not found on input line 37.

This is an MWE and its output:

\documentclass[a4paper,10pt]{article}
%
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
    @article{article1,
      title={Title 1},
      author={Author1},
      journal={Journal1},
      year={2019},
      keywords={Red}
     }
   @article{article2,
     title={Title 2},
     author={Author2},
     journal={Journal 2},
     year={2019},
     keywords={Blue}
     }
\end{filecontents}
%
\usepackage[backend=biber]{biblatex}
\addbibresource{\jobname.bib}
\usepackage{tikz}
% Setup a list of keywords
\newcommand*{\myKeywords}{Red,Blue}
\begin{document}
\nocite{*}
\printbibliography
\printbibliography[title=Red,keyword=Red]
\printbibliography[title=Blue,keyword=Blue]
% How to pass \keyword to \printbibliography as an optional argument?
\foreach \keyword in \myKeywords {
    \printbibliography[title=\keyword,keyword=\keyword]
}
\end{document}

enter image description here

1

same technique as in https://tex.stackexchange.com/a/228333/190358 also works here:

\documentclass[a4paper,10pt]{article}
%
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
    @article{article1,
      title={Title 1},
      author={Author1},
      journal={Journal1},
      year={2019},
      keywords={Red}
     }
   @article{article2,
     title={Title 2},
     author={Author2},
     journal={Journal 2},
     year={2019},
     keywords={Blue}
     }
\end{filecontents}
%
\usepackage[backend=biber]{biblatex}
\addbibresource{\jobname.bib}
\usepackage{tikz}
% Setup a list of keywords
\newcommand*{\myKeywords}{Red,Blue}
\begin{document}
\nocite{*}
%\printbibliography
%\printbibliography[title=Red,keyword=Red]
%\printbibliography[title=Blue,keyword=Blue]
% How to pass \keyword to \printbibliography as an optional argument?
\foreach \keyword in \myKeywords {
\begingroup\edef\x{\endgroup\noexpand
    \printbibliography[keyword=\keyword]
}\x    
}
\end{document}
2

I propose a much more flexible approach:

\begin{filecontents}{\jobname.bib}
    @article{article1,
      title={Title 1},
      author={Author1},
      journal={Journal1},
      year={2019},
      keywords={Red}
     }
   @article{article2,
     title={Title 2},
     author={Author2},
     journal={Journal 2},
     year={2019},
     keywords={Blue}
     }
\end{filecontents}

\documentclass[a4paper,10pt]{article}
\usepackage{xparse}
\usepackage[backend=biber]{biblatex}

\addbibresource{\jobname.bib}

\ExplSyntaxOn
\NewDocumentCommand{\xforeach}{sO{##1}mm}
 {
  \cs_set:Npn \__ross_xforeach:w #2 \q_stop { #4 }
  \IfBooleanTF { #1 }
   {
    \clist_map_inline:on { #3 } { \__ross_xforeach:w ##1 \q_stop }
   }
   {
    \clist_map_inline:nn { #3 } { \__ross_xforeach:w ##1 \q_stop }
   }
 }
\cs_generate_variant:Nn \clist_map_inline:nn { o }
\ExplSyntaxOff

% Setup a list of keywords
\newcommand*{\myKeywords}{Red,Blue}

\begin{document}
\nocite{*}

\printbibliography

\printbibliography[title=Red,keyword=Red]

\printbibliography[title=Blue,keyword=Blue]

% How to pass \keyword to \printbibliography as an optional argument?

\xforeach{Red,Blue}{\printbibliography[title=#1,keyword=#1]}

\xforeach*{\myKeywords}{\printbibliography[title=#1,keyword=#1]}

\xforeach[#1/#2]{
  This is the red bib/Red,
  This is the blue bib/Blue
}{\printbibliography[title=#1,keyword=#2]}

\end{document}

The \xforeach command has

  1. a *-variant (meaning the list is given implicitly, such as with \myKeywords)
  2. an optional “item template” argument (default #1) that tells how to split into parts each item (in the final example, #1/#2)
  3. the code to be executed on each item, with #1 to denote the current item (or with further placeholders if the optional argument is used).

enter image description here

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.