Greetings, I'm typesetting an address book whose addresses are in XML. A typical entry has this structure:
<family surname=""> <address street="" housenumber="" postcode="1" city="" telephone="" /> <members> <member first_name="" initials="" maiden_name="" birthday="" email="" mobile="" /> <member first_name="" initials="" birthday="" email="" mobile="" /> <member first_name="" initials="" birthday="" /> </members> </family> initials and birthday are required, first_name can be left blank and email, mobile and maiden_name are optional. I've written a macro (name) to compose the name, i.e. initials, first_name (maiden_name), and another macro (nameemaillink) to make the name a link associated with an email address. % Derive an individual's name \def\name#1% {\ifxmlattempty{#1}{first_name} {\xmlatt{#1}{initials}} \else {\xmlatt{#1}{initials}, \xmlatt{#1}{first_name}} \fi \ifxmlattempty{#1}{maiden_name} {} \else { \tfxx(\xmlatt{#1}{maiden_name})} \fi} % Create a mailto:link that associates a individual's name with their email address. \def\nameemaillink#1% {\ifxmlattempty{#1}{email} {\name{#1}} \else {\goto{\name{#1}} [url(mailto:\xmlatt{#1}{email})]} \fi} I thought I was done when I noticed that a composed name with an empty first name, with or without an email address, is slightly indented. In the mwe Moe and Curly, without first names, are indented; while Shemp and Michael aren't. That the undesired indentation/alignment is dependent on the presence of a first name is baffling. After this long description, if someone would look at the code and tell me where I've gone wrong I would be very grateful. The interesting bits begin on lines 8 and 12 in xml.tex. -- With kind regards, Michael
% XML processing instructions % Turn a phone number into a tel:link - without spaces \def\phonelink#1% {\goto{#1} [url(tel:\cldcontext{string.nospaces("#1")})]} % Derive an individual's name \def\name#1% {\ifxmlattempty{#1}{first_name} {\xmlatt{#1}{initials}} \else {\xmlatt{#1}{initials}, \xmlatt{#1}{first_name}} \fi \ifxmlattempty{#1}{maiden_name} {} \else { \tfxx(\xmlatt{#1}{maiden_name})} \fi} % Create a mailto:link that associates a individual's name with their email address. \def\nameemaillink#1% {\ifxmlattempty{#1}{email} {\name{#1}} \else {\goto{\name{#1}} [url(mailto:\xmlatt{#1}{email})]} \fi} % Make an individual's mobile phone number a tel:link. \def\mobilelink#1% {\ifxmlattempty{#1}{mobile} {} \else {\phonelink{\xmlatt{#1}{mobile}}} \fi} % Track these several elements. \startxmlsetups xml:list:base \xmlsetsetup{#1}{addressBook|family|address|members|member}{xml:list:*} \stopxmlsetups \xmlregisterdocumentsetup{list}{xml:list:base} % When we encounter the root <addressBook> element merely flush the rest. \startxmlsetups xml:list:addressBook \xmlflush{#1} \stopxmlsetups % Place each family in a frametext box \startxmlsetups xml:list:family \startframedtext[width=\textwidth] {\tfb \bf \xmlatt{#1}{surname}\ifxmlattempty{#1}{prefix}{}\else{, \xmlatt{#1}{prefix}}\fi}\blank \xmlflush{#1} \stopframedtext \blank[big] \stopxmlsetups % Enumerate the address information \startxmlsetups xml:list:address \xmlatt{#1}{street} \xmlatt{#1}{housenumber}\crlf \xmlatt{#1}{postcode} \xmlatt{#1}{city}\crlf \ifxmlattempty{#1}{telephone}{\vskip -1em}\else{\phonelink{\xmlatt{#1}{telephone}}}\fi %\vskip -1em \xmlflush{#1} \blank[big] \stopxmlsetups % The only purpose of the <members> element is to make a table of members. \startxmlsetups xml:list:members \starttabulate[|l|l|l|] \xmlflush{#1} \stoptabulate \stopxmlsetups % Each <member> gets his own table row. \startxmlsetups xml:list:member \NC \nameemaillink{#1} \NC \xmlatt{#1}{birthday} \NC \mobilelink{#1} \NC\NR \stopxmlsetups % finis
\environment xml.tex % XML processing instructions \setupframedtext[frame=off, width=\textwidth, align={flushleft,broad,nothyphenated}] \setupinteraction[state=start, color=darkblue] \starttext \xmlprocessfile{list}{mwe.xml}{} \stoptext % finis
<?xml version="1.0" encoding="utf-8"?> <addressBook> <family surname="Horwitz"> <!-- The Three Stooges --> <address street="Dorpstraat" housenumber="42" postcode="1234 AB" city="Hilversum" telephone="0123 456789" /> <members> <member first_name="Samuel" initials="S." birthday="17.03.1895" email="shemp@@stooges.com" mobile="0123456789" /> <!-- Shemp --> <member first_name="" initials="M." birthday="19.06.1897" email="m...@stooges.com" mobile="0123456789"/> <!-- Moe --> <member first_name="" initials="J." birthday="22.10.1903" mobile="0123456789" /> <!-- Curly --> <member first_name="Michael" initials="M." birthday="09.03.1939" mobile="0123456789" /> <!-- Michael --> </members> </family> </addressBook> <!-- finis -->
mwe.pdf
Description: Adobe PDF document
___________________________________________________________________________________ If your question is of interest to others as well, please add an entry to the Wiki! maillist : ntg-context@ntg.nl / https://mailman.ntg.nl/mailman3/lists/ntg-context.ntg.nl webpage : https://www.pragma-ade.nl / https://context.aanhet.net (mirror) archive : https://github.com/contextgarden/context wiki : https://wiki.contextgarden.net ___________________________________________________________________________________