plk / biblatex-apa

APA style for BibLaTeX
90 stars 48 forks source link

\NoCaseChange related error #186

Closed markvanatten closed 1 year ago

markvanatten commented 2 years ago

I am using LuaHBTeX, Version 1.15.0 (TeX Live 2022) LaTeX2e <2022-06-01> patch level 5 biblatex 2022/07/12 v3.18b apa.dbx 2022/06/22 v9.16 APA biblatex style data model biber version: 2.18

The file below compiles correctly if the biblatex option 'style=apa' is commented out, but with it, biber come to give an error:

WARN - I didn't find a database entry for '\NoCaseChange {Behmann1959}' (section 0).

\documentclass{article}

\begin{filecontents*}[overwrite]{test-nocasechange.bib}

@Article{Behmann1959,
  author =       "H. Behmann",
  title =        "Der Prädikatenkalkül mit limitierten Variabelen",
  subtitle = "Grundlegung einer natürlichen exakten Logik",
  journal =      "Journal of Symbolic Logic",
  volume =       "24",
number = "2",  
pages =        "112--140",
  date =         "1959",
}

@Article{Ackermann,
  author =       "W. Ackermann",
  title =        "Review of \citet{Behmann1959}",
  journal =      "Zentralblatt für Mathematik und ihre
                 Grenzgebiete",
  volume =       "Zbl 0095.24201",
}

\end{filecontents*}

\usepackage[
backend = biber, 
natbib=true, 
style=apa, 
]{biblatex} 

\addbibresource{test-nocasechange.bib}

\begin{document}

\citep{Ackermann,Behmann1959}

\printbibliography
\end{document}
moewew commented 2 years ago

Things work with an explicit \NoCaseChange (which I think is the saner markup anyway)

\documentclass{article}

\usepackage[
backend = biber, 
natbib=true, 
style=apa, 
]{biblatex} 
\addbibresource{\jobname.bib}

\begin{filecontents*}{\jobname.bib}
@article{Behmann1959,
  author   = {H. Behmann},
  title    = {Der Prädikatenkalkül mit limitierten Variabelen},
  subtitle = {Grundlegung einer natürlichen exakten Logik},
  journal  = {Journal of Symbolic Logic},
  volume   = {24},
  number   = {2},  
  pages    = {112--140},
  date     = {1959},
}
@article{Ackermann,
  author  = {W. Ackermann},
  title   = {Review of \NoCaseChange{\citet{Behmann1959}}},
  journal = {Zentralblatt für Mathematik und ihre Grenzgebiete},
  volume  = {Zbl 0095.24201},
}
\end{filecontents*}

\begin{document}
\citep{Ackermann,Behmann1959}

\printbibliography
\end{document}

I'll try and see what else can be done here.

markvanatten commented 2 years ago

Thanks -- especially for the point about saner markup.

moewew commented 2 years ago

@josephwright The example worked fine with an older version of the LaTeX kernel, though. It seems that biblatex's brace protection code and the LaTeX3 code to avoid messing with the wrong arguments interfere in some way to sneak in the undesirable \NoCaseChange here. Unfortunately, I don't fully understand the code in https://github.com/plk/biblatex/blob/dev/tex/latex/biblatex/blx-case-expl3.sty (cf. https://github.com/plk/biblatex/issues/960), so I don't know where to start looking into this.

josephwright commented 2 years ago

@moewew I'm working on it

moewew commented 2 years ago

@josephwright Thank you very much.

Meanwhile I found that double braces help

\documentclass{article}

\usepackage[
backend = biber, 
natbib=true, 
style=apa, 
]{biblatex} 
\addbibresource{\jobname.bib}

\begin{filecontents*}{\jobname.bib}
@article{Behmann1959,
  author   = {H. Behmann},
  title    = {Der Prädikatenkalkül mit limitierten Variabelen},
  subtitle = {Grundlegung einer natürlichen exakten Logik},
  journal  = {Journal of Symbolic Logic},
  volume   = {24},
  number   = {2},  
  pages    = {112--140},
  date     = {1959},
}
@article{Ackermann,
  author  = {W. Ackermann},
  title   = {Review of {{\citet{Behmann1959}}}},
  journal = {Zentralblatt für Mathematik und ihre Grenzgebiete},
  volume  = {Zbl 0095.24201},
}
\end{filecontents*}

\begin{document}
\citep{Ackermann,Behmann1959}

\printbibliography
\end{document}

but as I say my preference certainly is to drop the BibTeX-style brace protection and go for the saner LaTeX3 interface with \NoCaseChange and friends

\documentclass{article}

\usepackage[
  backend = biber,
  natbib=true, 
  style=apa, 
  bibtexcaseprotection=false,
]{biblatex} 
\addbibresource{\jobname.bib}

\begin{filecontents*}{\jobname.bib}
@article{Behmann1959,
  author   = {H. Behmann},
  title    = {Der Prädikatenkalkül mit limitierten Variabelen},
  subtitle = {Grundlegung einer natürlichen exakten Logik},
  journal  = {Journal of Symbolic Logic},
  volume   = {24},
  number   = {2},  
  pages    = {112--140},
  date     = {1959},
}
@article{Ackermann,
  author  = {W. Ackermann},
  title   = {Review of \NoCaseChange{\citet{Behmann1959}}},
  journal = {Zentralblatt für Mathematik und ihre Grenzgebiete},
  volume  = {Zbl 0095.24201},
}
\end{filecontents*}

\begin{document}
\citep{Ackermann,Behmann1959}

\printbibliography
\end{document}

where alternatively (and more conveniently) it is even enough to register \citet as a non-casechange command

\documentclass{article}

\usepackage[
  backend = biber,
  natbib=true, 
  style=apa, 
  bibtexcaseprotection=false,
]{biblatex} 
\addbibresource{\jobname.bib}

\AddToNoCaseChangeList{\citet}

\begin{filecontents*}{\jobname.bib}
@article{Behmann1959,
  author   = {H. Behmann},
  title    = {Der Prädikatenkalkül mit limitierten Variabelen},
  subtitle = {Grundlegung einer natürlichen exakten Logik},
  journal  = {Journal of Symbolic Logic},
  volume   = {24},
  number   = {2},  
  pages    = {112--140},
  date     = {1959},
}
@article{Ackermann,
  author  = {W. Ackermann},
  title   = {Review of \citet{Behmann1959}},
  journal = {Zentralblatt für Mathematik und ihre Grenzgebiete},
  volume  = {Zbl 0095.24201},
}
\end{filecontents*}

\begin{document}
\citep{Ackermann,Behmann1959}

\printbibliography
\end{document}
josephwright commented 2 years ago

@moewew I'm not 100% sure what is 'right' here: the BibTeX approach to something reading \foo{...} is to case-change ..., so we do need \NoCaseChange in general - I'd say 'avoid the BibTeX-style approach here' is likely the best answer.