Modifying bibliography entries using lua
Dear list, I'm struggling to output bibliography entries into lua for string modification (like making a particular author name bold). In effect, I just need something like the following: \starttexdefinition btx:customauthor \startluacode local text = context.btxflush('author') -- tex.sprint(text) -- fails because text remains nil \stopluacode \stoptexdefinition It's clear that btxflux is the wrong function for this as it writes the contents to file rather than returning a variable in lua... Is there a way to directly access what btxflush is writing through the publications table or other means? I've gone over the source code but I can't decipher what btxflush is actually doing. Thanks, Stan Longer MNWE: \stopluacode \startbuffer[ref] @article{solo, author = {Lastname, Firstname}, title = {Solo work}, journal = {Journal}, year = {2000}, month = {1}, volume = {1} } \stopbuffer \usebtxdataset[ref][ref.buffer] \setupbtx[dataset=ref] \definebtxrendering[ref][dataset=ref] \setupbtx[default:cite] [alternative=authoryear, etallimit=1] \starttexdefinition btx:customauthor \startluacode local text = context.btxflush('author') -- tex.sprint(text) -- text remains nill \stopluacode \stoptexdefinition \startsetups btx:default:list:article \texdefinition{btx:customauthor} \texdefinition{btx:default:title} \texdefinition{btx:default:journal} \texdefinition{btx:default:year} \removeunwantedspaces \removepunctuation \btxperiod \stopsetups \starttext Citations: \cite[solo] \startsubject[title=Bibliography] \placelistofpublications[ref][method=dataset] \stopsection \stoptext
On 7/23/2018 6:42 PM, Stanislav Sokolenko wrote:
Dear list,
I'm struggling to output bibliography entries into lua for string modification (like making a particular author name bold). In effect, I just need something like the following:
\starttexdefinition btx:customauthor \startluacode local text = context.btxflush('author') -- tex.sprint(text) -- fails because text remains nil \stopluacode \stoptexdefinition
It's clear that btxflux is the wrong function for this as it writes the contents to file rather than returning a variable in lua... Is there a way to directly access what btxflush is writing through the publications table or other means? I've gone over the source code but I can't decipher what btxflush is actually doing.
This is not for the fainthearted so here we go \startluacode function document.MyBoldPub(set,tag) -- local a = publications.getfield(set,tag,"author") -- inspect(a) -- local c = publications.getcasted(set,tag,"author") -- inspect(c) if c[1].surnames[1] == "Myname" then context.bold(function() context.btxflush('author') end ) else context.btxflush('author') end end \stopluacode \starttexdefinition btx:customauthor \ctxluacode{document.MyBoldPub("\currentbtxdataset","\currentbtxtag")} \stoptexdefinition try to avoid tex.print cum suis, use the proper context.* interface instead
Thanks,
Stan
Longer MNWE:
\stopluacode
\startbuffer[ref] @article{solo, author = {Lastname, Firstname}, title = {Solo work}, journal = {Journal}, year = {2000}, month = {1}, volume = {1} } \stopbuffer
\usebtxdataset[ref][ref.buffer] \setupbtx[dataset=ref]
\definebtxrendering[ref][dataset=ref] \setupbtx[default:cite] [alternative=authoryear, etallimit=1]
\starttexdefinition btx:customauthor \startluacode local text = context.btxflush('author') -- tex.sprint(text) -- text remains nill \stopluacode \stoptexdefinition
\startsetups btx:default:list:article \texdefinition{btx:customauthor} \texdefinition{btx:default:title} \texdefinition{btx:default:journal} \texdefinition{btx:default:year} \removeunwantedspaces \removepunctuation \btxperiod \stopsetups
\starttext
Citations: \cite[solo]
\startsubject[title=Bibliography] \placelistofpublications[ref][method=dataset] \stopsection
\stoptext
___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the Wiki!
maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context webpage : http://www.pragma-ade.nl / http://context.aanhet.net archive : https://bitbucket.org/phg/context-mirror/commits/ wiki : http://contextgarden.net ___________________________________________________________________________________
-- ----------------------------------------------------------------- Hans Hagen | PRAGMA ADE Ridderstraat 27 | 8061 GH Hasselt | The Netherlands tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl -----------------------------------------------------------------
Thanks Hans, that's really helpful!
This is not for the fainthearted so here we go
\startluacode function document.MyBoldPub(set,tag) -- local a = publications.getfield(set,tag,"author") -- inspect(a) -- local c = publications.getcasted(set,tag,"author") -- inspect(c) if c[1].surnames[1] == "Myname" then context.bold(function() context.btxflush('author') end ) else context.btxflush('author') end end \stopluacode
So if I wanted to bold one specific author in a reference of many, I can just loop over publications.getcasted(...), and print the appropriate names, initials, etc... That said -- is there any way to call the appropriate authorconversion routine based on the \setupbtx settings? I found the publications.authorhashers method table, which seems to do most of this work, but I'm not sure how to pick the appropriate method and ensure that the correct separators are used. Stan
On 7/23/2018 10:17 PM, Stanislav Sokolenko wrote:
Thanks Hans, that's really helpful!
This is not for the fainthearted so here we go
\startluacode function document.MyBoldPub(set,tag) -- local a = publications.getfield(set,tag,"author") -- inspect(a) -- local c = publications.getcasted(set,tag,"author") -- inspect(c) if c[1].surnames[1] == "Myname" then context.bold(function() context.btxflush('author') end ) else context.btxflush('author') end end \stopluacode
So if I wanted to bold one specific author in a reference of many, I can just loop over publications.getcasted(...), and print the appropriate names, initials, etc...
That said -- is there any way to call the appropriate authorconversion routine based on the \setupbtx settings? I found the publications.authorhashers method table, which seems to do most of this work, but I'm not sure how to pick the appropriate method and ensure that the correct separators are used. Best use the setups provided than reinvent the logic.
\startluacode function document.CheckMeB(set,tag,aut) local c = publications.getcasted(set,tag,"author") if c[aut].surnames[1] == "Foo" then context("\\bf") end end \stopluacode \startsetups btx:list:author:normalshort \fastsetup{btx:list:author:concat} \begingroup \ctxluacode{document.CheckMeB("\currentbtxdataset","\currentbtxtag",\number\currentbtxauthorindex)} \ifx\currentbtxinitials\empty \else \currentbtxinitials \btxparameter{separator:initials} \fi \ifx\currentbtxvons\empty \else \currentbtxvons \ifx\currentbtxsurnames\empty \else \btxparameter{separator:vons} \fi \fi \ifx\currentbtxsurnames\empty \else \currentbtxsurnames \ifx\currentbtxjuniors\empty \else \btxparameter{separator:juniors} \currentbtxjuniors \fi \fi \endgroup \fastsetup{btx:list:author:others} \stopsetups Or something similar (there are several wasy to do this). Hans ----------------------------------------------------------------- Hans Hagen | PRAGMA ADE Ridderstraat 27 | 8061 GH Hasselt | The Netherlands tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl -----------------------------------------------------------------
That's perfect, thank you! On 2018-07-23 06:32 PM, Hans Hagen wrote:
\startsetups btx:list:author:normalshort \fastsetup{btx:list:author:concat} \begingroup
\ctxluacode{document.CheckMeB("\currentbtxdataset","\currentbtxtag",\number\currentbtxauthorindex)}
\ifx\currentbtxinitials\empty \else \currentbtxinitials \btxparameter{separator:initials} \fi \ifx\currentbtxvons\empty \else \currentbtxvons \ifx\currentbtxsurnames\empty \else \btxparameter{separator:vons} \fi \fi \ifx\currentbtxsurnames\empty \else \currentbtxsurnames \ifx\currentbtxjuniors\empty \else \btxparameter{separator:juniors} \currentbtxjuniors \fi \fi \endgroup \fastsetup{btx:list:author:others} \stopsetups
I went with the following little extension to match and make bold multiple names: |\startbuffer[ref]@article{solo, author ={MyLast, MyFirst}, title ={Solo work}, journal ={Journal}, year ={2000}, month ={1}, volume ={1}}@article{co, author ={OtherLast, OtherFirst and MyLast, MyFirst and CoLast, CoFirst}, title ={Joint work}, journal ={Journal}, month ={1}, year ={2000}, volume ={1}}\stopbuffer\usebtxdataset[ref][ref.buffer]\setupbtx[dataset=ref]\definebtxrendering[ref][dataset=ref]\setupbtx[default:cite][alternative=authoryear, etallimit=1, authorconversion=normalshort]\startluacodeBoldNames ={{firstnames ="MyFirst", surnames ="MyLast"}, {initials ="C", surnames ="CoLast"}, }function document.CompareNames(reference, targets)-- Loop over targets for _, target in pairs(targets)do -- Loop over fields for key, value in pairs(target)do if reference[key]==nil then break end full_entry ='' for _, part in ipairs(reference[key])do full_entry =full_entry .. ' ' .. part end full_entry =string.sub(full_entry, 2)if full_entry ==value then return(true)end end end return(false)end function document.BoldNames(set, tag, aut)local c =publications.getcasted(set, tag, "author")if document.CompareNames(c[aut], BoldNames)then context("\\bf")end end \stopluacode\startsetupsbtx:list:author:normalshort \fastsetup{btx:list:author:concat}\begingroup\ctxluacode{document.BoldNames("\currentbtxdataset","\currentbtxtag",\number\currentbtxauthorindex)}\ifx\currentbtxinitials\empty\else\currentbtxinitials\btxparameter{separator:initials}\fi\ifx\currentbtxvons\empty\else\currentbtxvons\ifx\currentbtxsurnames\empty\else\btxparameter{separator:vons}\fi\fi\ifx\currentbtxsurnames\empty\else\currentbtxsurnames\ifx\currentbtxjuniors\empty\else\btxparameter{separator:juniors}\currentbtxjuniors\fi\fi\endgroup\fastsetup{btx:list:author:others}\stopsetups\starttextCitations: \cite[solo]\cite[co]\startsubject[title=Bibliography]\placelistofpublications[ref][method=dataset]\stopsection\stoptext| Cheers, Stan
On 7/24/2018 4:41 PM, Stanislav Sokolenko wrote:
I went with the following little extension to match and make bold multiple names: ok.
(this document.CompareNames makes a good candidate for a 'how to improve your lua code' tutorial ... maybe something for the ctx meeting) I didn't check what it does but ... for instance
BoldNames = { full_entry = ''
use locals! Hans ----------------------------------------------------------------- Hans Hagen | PRAGMA ADE Ridderstraat 27 | 8061 GH Hasselt | The Netherlands tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl -----------------------------------------------------------------
participants (2)
-
Hans Hagen
-
Stanislav Sokolenko