or
biblatex beamer
samcarter
I would like to hook into `.bbx` files to apply a few fixes to correctly format bibliographies in beamer.

I tried the `scrlfile` and `filehook` packages and they work fine for `.tex` or `.sty` files, but I can't get them to work with `.bbx` files.

A short example that would change the background colour if the hook would work:

```
\documentclass{beamer}

\RequirePackage{scrlfile}
\AfterFile{numeric.bbx}{
	\setbeamercolor{background canvas}{bg=red}
}

\RequirePackage{filehook}
\AtEndOfFile{numeric.bbx}{
	\setbeamercolor{background canvas}{bg=red}
}

\usepackage[style=numeric]{biblatex}

\begin{document}

\begin{frame}
test
\end{frame}

\end{document}
```

The `.log` file shows that the `numeric.bbx` file is found:

```
Package biblatex Info: Trying to load bibliography style 'numeric'...
Package biblatex Info: ... file 'numeric.bbx' found.

(/usr/local/texlive/2019/texmf-dist/tex/latex/biblatex/bbx/numeric.bbx
File: numeric.bbx 2019/12/01 v3.14 biblatex bibliography style (PK/MW)
Package biblatex Info: Trying to load bibliography style 'standard'...
Package biblatex Info: ... file 'standard.bbx' found.

(/usr/local/texlive/2019/texmf-dist/tex/latex/biblatex/bbx/standard.bbx
File: standard.bbx 2019/12/01 v3.14 biblatex bibliography style (PK/MW)
\c@bbx:relatedcount=\count433
\c@bbx:relatedtotal=\count434
))
```

Any ideas why the above code is not working as expected?

---

### Update

For everybody interested in this, there is a related discussion going on at https://github.com/josephwright/beamer/issues/581 and it looks as if biblatex might be going to provide hooks for other packages and classes to use.
Top Answer
Skillmon
*Disclaimer:* This answer just lists why this doesn't work. The below "What could you do" is only a proof of concept, which might break things and I don't advise anybody to actually use that code!

# What is `\input`?

In LaTeX the definition of `\input` is:

```
\let\@@input\input % saving the TeX primitive
\def\input{\@ifnextchar\bgroup\@iinput\@@input}
```

# What do the packages do?

`filehook` hooks into `\@iinput` and doesn't alter `\@@input`, which still is the primitive. It also hooks into `\InputIfFileExists`.

`scrlfile` only hooks into `\InputIfFileExists` and doesn't alter LaTeX's `\input` at all.

# What is `biblatex` doing?

`biblatex` does use its own macro called `\blx@inputonce` to include styles. It is defined as:

```
\protected\long\def\blx@inputonce#1#2#3#4#5#6{%
  \ifcsundef{blx@file@#1}
    {\blx@info@noline{Trying to load #2..}%
     \IfFileExists{#1}
       {\blx@info@noline{... file '#1' found}%
        #3\@@input\@filef@und#4#5%
        \listxadd\blx@list@req@stat{#1}%
        \@addtofilelist{#1}}
       {\blx@info@noline{... file '#1' not found}#6}%
     \global\cslet{blx@file@#1}\@empty}
    {#5}}
```

The important part is, that it only uses `\@@input\@filef@und`, which is neither altered by `filehook` nor by `scrlfile`. So `biblatex` effectively circumvents any hooking mechanism.

# What could you do?

Hook into `\blx@inputonce`, but unfortunately as you need the altered behaviour amidst the package you can only hook into things that are already defined before the package gets loaded and part of `\blx@inputonce`. So the most promising insertion point would be `\IfFileExists` altering it to inject your code if the filename matches anyone you specified. The following does so by altering an `\IfFileExists` internal, use at your own risk, this might break things if some code curries arguments!

```
\documentclass{beamer}

\usepackage{etoolbox}

\makeatletter
\let\IfFileExists@ORIG\IfFileExists@
\long\def\IfFileExists@#1#2#3%
  {%
    \IfFileExists@ORIG{#1}{\blxhack@prehook{#1}#2\blxhack@posthook{#1}}{#3}%
  }
\newcommand\blxhack@prehook[1]
  {%
    \@ifundefined{blxhack@prehook@#1}{}{\csname blxhack@prehook@#1\endcsname}%
  }
\newcommand\blxhack@posthook[1]
  {%
    \@ifundefined{blxhack@posthook@#1}{}{\csname blxhack@posthook@#1\endcsname}%
  }
\newcommand\blxhackPreFile[2]
  {%
    \csgappto{blxhack@prehook@#1}{#2}%
  }
\newcommand\blxhackPostFile[2]
  {%
    \csgappto{blxhack@posthook@#1}{#2}%
  }
\makeatother

\blxhackPostFile{numeric.bbx}{%
	\setbeamercolor{background canvas}{bg=red}%
}

\usepackage{biblatex}

\begin{document}

\begin{frame}
test
\end{frame}

\end{document}
```
Answer #2
samcarter
@moewew thankfully implemented an interface for this in https://github.com/plk/biblatex/pull/973

So with the development version of biblatex this is now very easy to solve:

```
\documentclass{beamer}

\makeatletter
\csappto{blx@filehook@postload@numeric.bbx}{%
  \mode<presentation>{\setbeamercolor{background canvas}{bg=red}}%
}
\makeatother

\usepackage[style=numeric]{biblatex}

\begin{document}

\begin{frame}
test
\end{frame}

\end{document}
```
Answer #3
CrazyHorse
create your own bbx-file on-the-fly and insert your code after including the `numeric.bbx`:



```
\documentclass{beamer}
\begin{filecontents}[force]{mynumeric.bbx}
\ProvidesFile{mynumeric.bbx}[\abx@bbxid]
\RequireBibliographyStyle{numeric}
\setbeamercolor{background canvas}{bg=red}
\endinput
\end{filecontents}

\usepackage[bibstyle=mynumeric]{biblatex}
\addbibresource{biblatex-examples.bib}
\begin{document}

\begin{frame}
test
\end{frame}

\nocite{*}
\begin{frame}
\printbibliography
\end{frame}

\end{document}
```
How to hook into .bbx files
samcarter
@CrazyHorse Welcome to TopTeX! And thanks a lot for your answer! In theory this of course works, the problematic part would be to get beamer users to use these styles.
samcarter replying to Skillmon
:) 
Skillmon replying to samcarter
Added it by habit, since most questions use `article` or something like that :)
samcarter replying to Skillmon
Thanks a lot for the ideas! I'm going to play around with them for a bit. (off-topic: you don't need `\usepackage{etoolbox}`, beamer loads this for you)
Skillmon
Oh, one could as well hack `\@addtofilelist`, I'm not sure what the security implications that could have, but maybe they are not as severe.
Skillmon replying to samcarter
posted a hack demonstration. This hack is very unstable though! If someone did `\IfFileExists{<file>}{\usefileandgrabmore{<file>}}{\dontusefileandgrabmore}{<more>}` this would break in the worst possible manner! Another possibility would be to hack `\@@input`, but that's just as bad.
Skillmon replying to samcarter
the only viable hook point would be to hook `\IfFileExists` and inject your post hook after its first argument. Unfortunately `biblatex` doesn't have any other access point, I'm afraid.
samcarter replying to Skillmon
Thanks a lot for your explanation! To know why is really helpful as this gives me a few ideas in which direction to look instead.
Skillmon
Should an answer only state why this doesn't work, or should it also provide a fix that's supposed to work?@samcarter