# Each of my article type references causes 'You can't pop an empty literal stack' error using BibTeX

I have modified my question based on the commands of the first version (thank you). This is the question of version 2. I think I have located the problematic codes.

The problematic 'bst' file can be found in HERE, and a minimal 'bib' file can be found in THERE.

Usually, when receiving the error message 'You can't pop an empty literal stack for entry 5427079 while executing---line 1116 of file roblike.bst', it means the associated item in the file 'bib' is missing.

In this condition, it generates the following references and errors.

You can't pop an empty literal stack for entry 5427079 while executing---line 1119 of file roblike.bst

However, the error message is pointing to a useless code. The code in Line 1116 is ITERATE {call.type$}. How can I know what is missing? ## First attempt: find a way to track the BibTeX. How to track the working of the BibTeX? My first attempt is to find a way to run 'bst' file step by step. From the comments of the first version, I think the answer is no. So, I turn to the code that is used to process the article type, it contains: FUNCTION {article} { output.bibitem format.authors "author" output.check author format.key output % special for new.block format.title "title" output.check new.block crossref missing$
{ format.journals
format.year.vol.num.pages output
}
{ format.article.crossref output.nonnull
format.pages output
}
if$new.block note output fin.entry }  And, two associated functions: FUNCTION {format.article.crossref} { "In" % this is for gmjlike " \cite{" * crossref * "}" * } FUNCTION {format.year.vol.num.pages} { volume empty$
{ "empty volume in " cite$* warning$ }
{ write$", {\bf " volume * "}" * extra.label * mid.sentence 'output.state := } if$
number empty$'skip$
{ "(" number * ")" * *
volume empty${ "there's a number but no volume in " cite$ * warning$} 'skip$
if$} if$
pages empty$'skip$
{ duplicate$empty$
{ pop$format.pages } { ", " * pages n.dashify * } if$
}
if$year empty$
{ "empty year in " cite$* warning$ }
{ write$" (" year * ")" * extra.label * mid.sentence 'output.state := } if$
}


with the entry 5427079 in the file bib:

@article{5427079,
author = {Bioucas-Dias, Jos{\'e} M. and Figueiredo, M{\'a}rio A. T.},
journal = {IEEE Transactions on Image Processing},
number = {7},
pages = {1720-1730},
title = {Multiplicative Noise Removal Using Variable Splitting and Constrained Optimization},
volume = {19},
year = {2010}}


I do not think I lost anything in that item.

## Second attempt: I think I know where is wrong.

Since BibTeX cannot run step by step, I can guide the workflow by giving the proper test case.

I add a crossref item for 5427079 and reference with \cite{5427079} \cite{Rokach2010}, which leads to no error.

@article{5427079,
author = {Bioucas-Dias, Jos{\'e} M. and Figueiredo, M{\'a}rio A. T.},
journal = {IEEE Transactions on Image Processing},
number = {7},
pages = {1720-1730},
title = {Multiplicative Noise Removal Using Variable Splitting and Constrained Optimization},
volume = {19},
crossref = {Rokach2010},
year = {2010}}


Warning--can't use both author and editor fields in Rokach2010
(There was 1 warning)
Process exited normally


That means the codes below are OK.

   {
format.article.crossref output.nonnull
format.pages output
}


so the problem is limited to the following codes.

{
format.journals
format.year.vol.num.pages output
}


Then, I remove the crossref item and reference the second line. The BibTeX reports no error, again.

    {
format.journals
%     format.year.vol.num.pages output
}


So, the problem lies in the following line.

 format.year.vol.num.pages output


Then, I restore the second line and reference the first line. The error occurs, again.

    {
%      format.journals
format.year.vol.num.pages output
}


Then, I think the function format.year.vol.num.pages must be the problem. So, I reference everything inside. The function is empty!

FUNCTION {format.year.vol.num.pages}
{
%  volume empty$% { "empty volume in " cite$ * warning$} % { write$
%      ", {\bf " volume * "}" * extra.label *
%      mid.sentence 'output.state :=
%    }
%  if$% number empty$
%    'skip$% { "(" number * ")" * * % volume empty$
%        { "there's a number but no volume in " cite$* warning$ }
%        'skip$% if$
%    }
%  if$% pages empty$
%    'skip$% { duplicate$ empty$% { pop$ format.pages }
%        { ", " * pages n.dashify * }
%      if$% } % if$
%  year empty$% { "empty year in " cite$ * warning$} % { write$
%      " (" year * ")" * extra.label *
%      mid.sentence 'output.state :=
%    }
%  if$}  ## The problem remains! Strange! You can't pop an empty literal stack for entry 5427079 while executing---line 1119 of file roblike.bst  • can you edit to add a small but complete bst file that produces the error, so people can debug. Aug 14 '21 at 9:56 • Unfortunately, we will only be able to judge whether or not the code shown in FUNCTION {article} is OK once we know the definitions of all functions called by that piece of code. That means that we essentially need to see the entire .bst file to investigate this issue. On first glance the entry 5427079 does indeed contain all relevant 'required' fields, so one would expect it to compile without error. (And even if it didn't, the style would ideally catch these issues before having an internal You can't pop an empty literal stack error pop up.) Aug 15 '21 at 6:17 • The .bst file will probably be too long to be included directly into the question, so you will have to upload it elsewhere. In that case, please choose a text-sharing/code-sharing service like pastebin.com, gitlab.com/explore/snippets, gist.github.com over file-sharing services. Aug 15 '21 at 6:21 • At last, I have to focus on the function output. It contains the following codes: FUNCTION {output} { duplicate$ empty$'pop$ 'output.nonnull if$} There is a pop$. Why pop? If I remove the use of function output. There is no error. But, this is not quite right. What is the function output used for? % format.year.vol.num.pages output format.year.vol.num.pages } { format.article.crossref output.nonnull format.pages output } @moewe Aug 16 '21 at 2:40

The .bst file has several issues.

I think I could isolate the problem that caused the specific error you asked about in the question, but the code I saw did not inspire confidence that this was the only problem with this .bst file.

The fact that the .bst language is stack-based and uses reverse Polish notation can make things tricky to follow.

You have already identified the problematic bits of code: The functions format.journals and format.year.vol.num.pages.

format.journals is defined as

FUNCTION {format.journals}
{ journal empty${ "" } { journal emphasize "," * "journal" output.check } if$
}


Assuming you have a journal in your @article entry, this leaves the stack empty, because output.check writes out the first item on the stack and then removes it.

Unfortunately, if the journal is empty, the function pushes an empty string to the stack. So the behaviour is vastly different in that case.

Indeed, if you remove the journal from your example entry, BibTeX compiles without an error message, but the output is completely garbage.

If you look at the output that BibTeX produces despite the error if there is a journal you see that it contains two commas, one of those is added by this function, so we can remove the comma here. This allows us to simplify the function to the following

FUNCTION {format.journals}
{ journal emphasize "journal" output.check }


which, incidentally is exactly what apalike.bst does (it just doesn't define a function for it).

format.year.vol.num.pages is defined as

FUNCTION {format.year.vol.num.pages}
{
volume empty${ "empty volume in " cite$ * warning$} { write$
", {\bf " volume * "}" * extra.label *
mid.sentence 'output.state :=
}
if$number empty$
'skip${ "(" number * ")" * * volume empty$
{ "there's a number but no volume in " cite$* warning$ }
'skip$if$
}
if$pages empty$
'skip${ duplicate$ empty${ pop$ format.pages }
{ ", " * pages n.dashify * }
if$} if$
year empty${ "empty year in " cite$ * warning$} { write$
" (" year * ")" * extra.label *
mid.sentence 'output.state :=
}
if$}  Again, the function can leave the stack in different states depending on which conditional path was taken. If there is no volume, the function just issues a warning and otherwise leaves the stack alone. If there is a volume, the function first pops one item from the stack and writes it and then adds more stuff to the stack. Since format.journals leaves the stack empty, this will give an error. Something similar is done for year. The way the function is set up means that all conditionals should just push their contents onto the stack and concatenate it so that at the end there is one long string on the stack that can be written out. Additionally, the functions seem to mention extra.label in random places and set output.state for seemingly no reason. Fixing this and another comma gives us FUNCTION {format.year.vol.num.pages} { volume empty$
{
"empty volume in " cite$* warning$
""
}
{
"{\bf " volume * "}" *
}
if$number empty$
'skip${ "(" number * ")" * * volume empty$
{ "there's a number but no volume in " cite$* warning$ }
'skip$if$
}
if$pages empty$
'skip${ duplicate$ empty${ pop$ format.pages }
{ ", " * pages n.dashify * }
if$} if$
year empty${ "empty year in " cite$ * warning$} { " (" year * extra.label * ")" * * } if$
}


Fixing the two functions as shown here lets the example compile fine again. But there might be more errors.

It should be noted that the .bst file is based quite heavily on apalike.bst (all mentions of apalike are replaced by gmjlike), which is an author-year style. The style in its current form does not provide author-year data and can thus only be used as a numeric style. But numeric styles should calculate the longest label for correct indentation in the bibliography, which apalike does not have to do. This means that this style produces misaligned bibliographies.

I strongly recommend you stop using this style or you get in touch with the developer or distributor of the style immediately to tell them about these issues.