Re: [NTG-context] List of Symbols/Abbreviations/Glosses with more then two entries

2019-10-11 Thread Thomas Welter
Since there has not been a response (and since I am still unhappy with the 
limitations of \definesynonyms) I came up with my own solution which is 
included in this mail. The code provides a fully automated handling of symbols. 
I think this might be useful for a lot of people in engineering, physics, etc.. 
It should be more generalized and packed into a module though.

Kind regards,

Thomas

% Document Layout
\setupcolors[state=start]
\setuppapersize[A4][A4]

% Typography
\setupwhitespace[medium]
\setupindenting[no]
\setupbodyfont[sans, 11pt]

% PDF Output Adjustments
\setupinteraction[state=start, focus=standard, style=, click=yes, color=, 
contrastcolor=,]

% Units
\defineunit[sunit][separator=small]
\setupunit[space=medium]

\setuphead[section][style={\bfc}, before={\bigskip}, after={}]

% Lua code to set up a database of symbols
\definedescription[SymItem][]
\startluacode
userdata = userdata or {}
userdata.listofsymbols = {} -- hash table with all symbols of the form 
keyword:{symbol, {unit=... , description=...}}

function userdata.addsym(keyword, symbol, option) -- parses the input and adds 
an entry to the hash table
keywords = utilities.parsers.settings_to_array(keyword)
symbols = utilities.parsers.settings_to_array(symbol)
options = utilities.parsers.settings_to_hash(option)
userdata.listofsymbols[keywords[1]] = {symbols[1], options}
end

function userdata.getsym(keyword) -- prints the symbol to a given keyword
context.math(userdata.listofsymbols[keyword][1])
end

function userdata.symattr(keyword, attribute) -- prints whatever attribute of 
the symbol (its unit, description, ...)
context(userdata.listofsymbols[keyword][2][attribute])
end

function userdata.sorttable(t,o) -- sorting algorithm: hash table gets inserted 
to an indexed array which then can be indexed by the iterator
local a = {}
for n in pairs(t) do
table.insert(a, n)
end
if o then
table.sort(a, function(a,b) return o(t, a, b) end)
else
table.sort(a)
end
local i = 0
local iterator = function ()
i = i + 1
return a[i], t[a[i]]
end
return iterator
end

function userdata.placelistofsymbols() -- prints the List of Symbols
greekgroup = {}
latingroup = {}
for keyword, values in next, userdata.listofsymbols do -- devides the symbol 
list into greek and latin letters
if values[2]["group"] == "greek" then
greekgroup[keyword] = values
elseif values[2]["group"] == "latin" then
latingroup[keyword] = values
end
end
context.setuptabulate{distance="1ex"}
context.starttabulate{"|lw(0.18\\textwidth)|lw(0.18\\textwidth)|p(0.6\\textwidth)|"}
context.NC()
context.bf() context("Symbol")
context.NC()
context.bf() context("Unit")
context.NC()
context.bf() context("Description")
context.NC()
context.FR()
context.HL()
function printlistitem(keyword, values)
context.NC()
context.startSymItem({reference="sym:"..keyword, title=values[1]})
context.math(values[1])
context.stopSymItem()
context.NC()
context(values[2]["unit"])
context.NC()
context(values[2]["description"])
context.NC()
context.MR()
end
for keyword, values in userdata.sorttable(greekgroup, function(t,a,b) return 
string.lower(a) < string.lower(b) end) do -- sorting algorithm uses the 
"<"-comparator to compare the keys a and b
printlistitem(keyword, values)
end
context.TB{"2ex"}
for keyword, values in userdata.sorttable(latingroup, function(t,a,b) return 
string.lower(a) < string.lower(b) end) do
printlistitem(keyword, values)
end
context.stoptabulate()
end
\stopluacode

% Create the hook to the lua functions
\def\addsym[#1][#2][#3]{\ctxlua{userdata.addsym([==[#1]==], [==[#2]==], 
[==[#3]==])}}
\def\getsym[#1]{\ctxlua{userdata.getsym([==[#1]==])}}
\def\symattr[#1][#2]{\ctxlua{userdata.symattr([==[#1]==], [==[#2]==])}}

% Print a symbol with \sym[keyword]. Printed as an internal link to the entry 
in the List of Symbols via \goto{symbol}[sym:keyword]
\def\sym[#1]{\goto{\getsym[#1]}[sym:#1]}

% Create a database containing all symbols with 
\addsym[keyword][symbol][options]
\def\loadsymbols{
\addsym[beta][\beta][unit={\sunit{meter per second}}, description={Mass 
transfer coefficient}, group={greek}]
\addsym[alpha][\alpha][unit={\sunit{watt per square meter per kelvin}}, 
description={Heat transfer coefficient}, group={greek}]
\addsym[c][c][unit={\sunit{kilogram per cubic meter}}, 
description={Concentration}, group={latin}]
\addsym[m][m][unit={\sunit{kilogram}}, description={Mass}, group={latin}]
\addsym[A][A][unit={\sunit{square meter}}, description={Phase boundary 
interface}, group={latin}]
\addsym[Q][Q][unit={\sunit{joule}}, description={Heat}, group={latin}]
\addsym[T][T][unit={\sunit{kelvin}}, description={Temperature}, group={latin}]
\addsym[t][t][unit={\sunit{second}}, description={Time}, group={latin}]
}

% Print the List of Symbols with \placelistofsymbols
\def\placelistofsymbols{\loadsymbols\ctxlua{userdata.placelistofsymbols()}}

\starttext

\startfrontmatter

\startsubject[title=Content]
\placecontent
\stopsubject

\startsection[title=List of Tables]
\placelistoftables
\stopsection

\s

[NTG-context] List of Symbols/Abbreviations/Glosses with more then two entries

2019-06-12 Thread Thomas Welter
The synonym "sym" defined by \definesynonyms[sym][syms][\symdesc] can take 2 
entries by default:

\sym[]{}{}

For theses and whitepapers in the natural sciences and in engineering it is 
needed to introduce another entry for the unit:

\sym[]{}{}{} (<-- This does of course not 
compile, take it as a feature request)

e.g. 

\sym[Salpha]{\alpha\ }{$[W~m^{-2}~K^{-1}]$}{Heat Transfer Coefficient}

where 

\sym[Salpha]{\alpha\ }{$[W~m^{-2}~K^{-1}]$ Heat Transfer Coefficient}

cannot be a good workaround since \symdesc{Salpha} should not include the unit. 
And of course I want the unit entry to be in a separate column when calling 
\placelistofsynonyms[sym]

In LaTeX I accomplished this with glossaries and glossary-mcols. Is there some 
neat trick to get this behaviour "the ConTeXt way" (maybe with some Lua + 
*.aux)? 

The next step would be to define the table headers of the list of symbols such 
as "Symbol \NC Unit \NC Description"...

Thanks in advance and kind regards,

Thomas
___
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
___