I'm writing a package for a software design document. There is a section related to software interfaces between modules, and another section to describe each module. Here there is a summary of interfaces (functions and variables) used by module, collected from previous section using the package collect.
I've created some macro to create interfaces (and collecting needed info), and others to place collected info into desired place, but compiling the document gives me multiple occurrences of following error:
! You can't use a prefix with `\openin'.
<to be read again>
\openin
l.306 \insertprovidedinterfaces{SUP}
Typing r run pdfLaTeX to the end, and the result is exactly what is expected, but I'm not able to understand/get rid of this messages.
Any hints?
Here is a MWE:
\documentclass[a4paper, oneside, 10pt]{article}
\usepackage[english]{babel}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\renewcommand*\familydefault{\sfdefault}
\usepackage[table, svgnames]{xcolor}
\usepackage{booktabs}
\usepackage{xparse}
\usepackage{xstring}
\usepackage{longtable}
\usepackage{collect}
\usepackage{tikz}%
\usepackage{hyperref}
%%
\colorlet{IFcolor}{Yellow!30!Blue!20}
\colorlet{IFVcolor}{Yellow!80!Blue!20}
%
% definitions of variables containing modules list, later used
% to avoid re-defining an already defined collection
% pfun -> provided functions
% nfun -> needed functions
% pvar -> provided variables
% nvar -> needed variables
\def\pfuncollectionlist{}
\def\nfuncollectionlist{}
\def\pvarcollectionlist{}
\def\nvarcollectionlist{}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% environment for interfaces - functions
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Usage:
% param 1: Provider acronym
% param 2: name of function including ()
% param 3: comma-separated caller list
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\NewDocumentEnvironment{int-interface}{mmm}%
{%before
\phantomsection\label{iifprovided#1-#2}%
% provided function interfaces
\newpfuncollection{#1-provided-fun}%
\begin{collect} {#1-provided-fun}{}{}%
\item \hyperref[iifprovided#1-#2]{#1\_#2}
\end{collect}%
%
% needed function interfaces
\def\callers{#3}
\foreach \caller in \callers%
{%
\newnfuncollection{\caller-needed-fun}%
\begin{collect}{\caller-needed-fun}{}{}%
\item \hyperref[iifprovided#1-#2]{#1\_#2}%
\end{collect}%
}%
%
\small
\longtable[htbp]{>{\columncolor{IFcolor}}p{3.5cm}p{12cm}}\kill%\toprule
\endfirsthead
\multicolumn{2}{l}{\footnotesize\emph{Follows from previous page}} \\
\endhead
% normal foot
\multicolumn{2}{r}{\footnotesize\emph{Continue in the next page}} \\
\endfoot
% last foot
\bottomrule
\endlastfoot
%
% here the stationary contents
\toprule
Syntax & #1\_#2 \\
}%
{%
%after
Callers & #3 \\%
\endlongtable
}%
%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% environment for interfaces - variables
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Usage:
% param 1: Provider acronym
% param 2: name of variable
% param 3: comma-separated caller list, read access
% param 4: comma-separated caller list, write access
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\NewDocumentEnvironment{int-interface-var}{mmmm}%
{%before
\phantomsection\label{iifprovided#1-#2}%
% provided function interfaces
\newpvarcollection{#1-provided-var}%
\begin{collect}{#1-provided-var}{}{}%
\item \hyperref[iifprovided#1-#2]{#1\_#2}
\end{collect}%
%
%
% needed interfaces
% two consecutive \foreach are used to decide whether writing R, W or R/W
% first loop search for every read caller in writecaller list;
% if read caller is found in writecallers list,
% a 'R/W' is appended; elsewhere, it is 'only' R.
% Then similar thing is done starting from writecaller list:
% if actual writecaller is NOT found in readcaller list, it is marked only W;
% elsewhere nothing has to be done, because R/W has been already treated in
% previous loop (RW)
\def\callersreadlist{#3}
\def\callerswritelist{#4}
% detecting RW or R
\foreach \readcaller in \callersreadlist
{
\IfSubStr{\callerswritelist}{\readcaller}
{
\newnvarcollection{\readcaller-needed-var}%
\begin{collect}{\readcaller-needed-var}{}{}%
\item \hyperref[iifprovided#1-#2]{#1\_#2} [Read/Write]
\end{collect}%
}%
% else%
{%
\newnvarcollection{\readcaller-needed-var}%
\begin{collect}{\readcaller-needed-var}{}{}%
\item \hyperref[iifprovided#1-#2]{#1\_#2} [Read only]
\end{collect}%
}%
}
% detecting W
\foreach \writecaller in \callerswritelist
{
\IfSubStr{\callersreadlist}{\writecaller}
{
% if found, nothing to do
}%
% else%
{%
\newnvarcollection{\writecaller-needed-var}%
\begin{collect}{\writecaller-needed-var}{}{}%
\item \hyperref[iifprovided#1-#2]{#1\_#2} [Write only]
\end{collect}%
}%
}
%
% write longtable
\small
% didascalia ed etichetta
\longtable[htbp]{>{\columncolor{IFVcolor}}p{3.5cm}p{12cm}}\kill%\toprule
\endfirsthead
\multicolumn{2}{l}{\footnotesize\emph{Follows from previous page}} \\
\endhead
% piede normale
\multicolumn{2}{r}{\footnotesize\emph{Continue in the next page}} \\
\endfoot
% piede finale
\bottomrule
\endlastfoot
%
% here the stationary contents
\toprule
Syntax & #1\_#2 \\%
}%
{%
%after
% do the same search as before, to build list of read only, write only and read/write access modules
\def\callersreadlist{#3}%
\def\callerswritelist{#4}%
Accessed by: & %
\foreach\readcaller in \callersreadlist
{%
\IfSubStr{\callerswritelist}{\readcaller}%
{%
% if found
\readcaller{} \accessmode{rw}$\quad$%
}%
% else%
{%
\readcaller{} \accessmode{r}$\quad$%
}%
}%
%
%
\foreach\writecaller in \callerswritelist
{%
\IfSubStr{\callersreadlist}{\writecaller}%
{%
}%
% else%
{%
\writecaller{} \accessmode{w}$\quad$%
%
}%
}%
\\
\endlongtable
}%
%
%
%
%
%
\newcommand{\accessmode}[1]{%
(#1),
}%
%
\DeclareRobustCommand{\insertprovidedinterfaces}[1]{%
\paragraph{Function interfaces}
\IfSubStr{\pfuncollectionlist}{#1}{%
% Collection '#1-provided-fun' exists
\begin{itemize}
\includecollection{#1-provided-fun}%
\end{itemize}
}{%
None.
}%
\paragraph{Variable interfaces}
\IfSubStr{\pvarcollectionlist}{#1}{%
% Collection '#1-provided-var' exists
\begin{itemize}
\includecollection{#1-provided-var}%
\end{itemize}
}{%
None.
}%
}%
%
\DeclareRobustCommand{\insertneededinterfaces}[1]{%
\paragraph{Function interfaces}
\IfSubStr{\nfuncollectionlist}{#1}{%
% Collection '#1-needed-fun' esists
\begin{itemize}
\includecollection{#1-needed-fun}%
\end{itemize}
}{%
None.
}%
\paragraph{Variable interfaces}
\IfSubStr{\nvarcollectionlist}{#1}{%
% Collection '#1-needed-var' esists
\begin{itemize}
\includecollection{#1-needed-var}%
\end{itemize}
}{%
None.
}%
}%
%
\DeclareRobustCommand{\newpvarcollection}[1]{%
\IfSubStr{\pvarcollectionlist}{#1}{%
}{%
\xdef\pvarcollectionlist{\pvarcollectionlist{} #1}
\definecollection{#1}%
}%
}%
%
\DeclareRobustCommand{\newnvarcollection}[1]{%
\IfSubStr{\nvarcollectionlist}{#1}{%
}{%
\xdef\nvarcollectionlist{\nvarcollectionlist{} #1}
\definecollection{#1}%
}%
}%
%
\DeclareRobustCommand{\newpfuncollection}[1]{%
\IfSubStr{\pfuncollectionlist}{#1}{%
}{%
\xdef\pfuncollectionlist{\pfuncollectionlist{} #1}
\definecollection{#1}%
}%
}%
%
\DeclareRobustCommand{\newnfuncollection}[1]{%
\IfSubStr{\nfuncollectionlist}{#1}{%
}{%
\xdef\nfuncollectionlist{\nfuncollectionlist{} #1}
\definecollection{#1}%
}%
}%
%
\begin{document}
\section{Interfaces}
Here some software interfaces:
\begin{int-interface}{SUP}{eGetActualSystemStatus}{ICP}
Parameters & None \\
Return type & System status code. Codified value \\
Purpose & Obtain actual system status from \emph{SUP} \\
\end{int-interface}
%
\begin{int-interface}{SUP}{eSetOverrideRequest()}{SMB}
Parameters & Request code: ENTER, EXIT \\
Return type & Operation result. Codified value. \\
Purpose & To set an override request to \emph{SUP} \\
\end{int-interface}
%
\begin{int-interface-var}{HAL}{ausInputVoltageSamples}{SENS, I2C}{I2C, ICP}
Type & Buffer of 5 samples \\
Purpose & To store acquired input voltage samples\\
\end{int-interface-var}
%
\section{Modules description}
Some descriptive stuff\ldots
\subsection{SUP module}
Other descriptions\ldots
Here is a list of provided interfaces:
\insertprovidedinterfaces{SUP}
\subsection{HAL module}
Other descriptions\ldots
Here is a list of provided interfaces:
\insertprovidedinterfaces{HAL}
\end{document}
