\documentclass[a4paper]{article}

%% Language and font encodings
\usepackage[english]{babel}
\usepackage[utf8x]{inputenc}
\usepackage[T1]{fontenc}

%% Sets page size and margins
\usepackage[a4paper,top=3cm,bottom=2cm,left=3cm,right=3cm,marginparwidth=1.75cm]{geometry}

%% Useful packages
\usepackage[colorlinks=true,
            linkcolor = blue,
            urlcolor  = blue,
            citecolor = blue,
            anchorcolor = blue]{hyperref}
\usepackage{xcolor}
\usepackage{minted}
\usepackage{csquotes}

\definecolor{LG}{HTML}{F9F9F9}

%% Informations
\title{\textsf{luapackageloader} package}
\author{Deepak Jois \\ \href{deepak.jois@gmail.com}{deepak.jois@gmail.com}}

\begin{document}
\maketitle

\section*{Introduction}
LuaTeX modifies the package loading behavior for Lua package, as mentioned in
Section 3.2 of the LuaTeX manual:

\begin{displayquote}
LuaTEX is able to use the kpathsea library to find require()d modules. For this
purpose, \texttt{package.searchers[2]} is replaced by a different loader function,
that decides at runtime whether to use kpathsea or the built-in core Lua
function. It uses kpathsea when that is already initialized at that point in
  time, otherwise it reverts to using the normal \texttt{package.path} loader.
\end{displayquote}

What this means is that once kpathsea is initialized, the normal package
loading behavior is no longer available.

This package allows Lua package loading behavior inside LuaTeX to use \textit{both}
kpathsea and the default loading mechanism. If the module is not available in kpathsea,
LuaTeX will try to load it from \texttt{package.path}. This functionality is very useful,
for instance when you need to use \href{https://luarocks.org/}{LuaRocks} modules inside LuaTeX.

\section{Installation}

Install this package like any other \TeX~or \LaTeX~package.

\section{Dependencies}

This package depends on \href{https://www.ctan.org/pkg/ifluatex}{ifluatex} CTAN package.

\section{Usage}

\subsection{Plain \TeX}
In Plain \TeX, you can import the module as follows:

\begin{minted}[bgcolor=LG, fontsize=\footnotesize]{tex}
\input luapackageloader.sty
\end{minted}

\subsection{\LaTeX}

In \LaTeX, add the \texttt{luapackageloader} packages to your document:

\begin{minted}[bgcolor=LG, fontsize=\footnotesize]{tex}
\usepackage{luapackageloader}
\end{minted}

\subsection{Loading Packages}

Once you have imported \texttt{luapackageloader}, it adds a table called
\texttt{luapackageloader} under the global namepace, and automatically
overrides the default LuaTeX package searchers. It should be possible to load a
Lua package (including \href{https://luarocks.org/}{LuaRocks} modules, as long
as \texttt{package.path} and \texttt{package.cpath} is setup properly in your
environment) as follows:

\begin{minted}[bgcolor=LG, fontsize=\footnotesize]{tex}
\directlua{
  local serpent = require("serpent") % luarocks install serpent
}
\end{minted}

\subsection{Reverting to default loading behavior}

The package loading can be reverted back to the default LuaTeX behavior using the \texttt{restore\_kpse\_searchers()}
\begin{minted}[bgcolor=LG, fontsize=\footnotesize]{tex}
\directlua{
  luapackageloader.resetore_kpse_searchers()
}
\end{minted}

\subsection{Manually setting up to load Lua packages}

This package exposes the function \texttt{add\_lua\_searchers()}, to manually setup the package searchers again, if it was reverted for some reason, after loading the package.

\begin{minted}[bgcolor=LG, fontsize=\footnotesize]{tex}
\input luapackageloader.sty
\directlua{
  % Let’s revert the package searchers to their default loading behavior.
  luapackageloader.restore_kpse_searchers()

 % Some code here...

  % Now let’s setup the package searchers to use Lua searchers again.
  luapackageloader.add_lua_searchers()
}
\end{minted}

\end{document}