Okay, a bit boring, but as promised, here are some Python functions to generate LaTeX source for long authors lists for MNRAS and A&A.

First, a small utility:

def getSortedInstituteCodes(authorList, authorInstituteCodes):
    """Return a list of institute codes, in the correct order for authorList.

    authorList = ["J.~Bloggs", "A.N.~Other"]
    authorInstituteCodes = {"J.~Bloggs":1, "A.N.~Other":[1,"Sussex"]}
    """
    instituteCodes = []
    for author in authorList:
        codes = authorInstituteCodes[author]
        if not hasattr(codes, '__iter__'):
            codes = [codes]
        for code in codes:
            if not code in instituteCodes:
                instituteCodes.append(code)
    return instituteCodes

then the function for MNRAS:

def getAuthorsStringMNRAS(authorList, authorInstituteCodes, institutesTex,
                          authorEmails):
    """Return a string containing LaTeX for MNRAS authors list.

    authorList = ["J.~Bloggs", "A.N.~Other"]
    authorInstituteCodes = {"J.~Bloggs":1, "A.N.~Other":[1,"Sussex"]}
    institutesTex = {1:"Somewhere, Earth", "Sussex":"University of Sussex"}
    authorEmails = {"J.~Bloggs": "j.bloggs@no.where"}
    """
    instituteCodes = getSortedInstituteCodes(authorList, authorInstituteCodes)

    # Make a list of strings:
    # "Author Name$^{1,2}$\thanks{E-mail: \texttt{j.bloggs@no.where}}"
    authorInstituteList = []
    for author in authorList:
        try:
            codes = authorInstituteCodes[author]
            if not hasattr(codes, '__iter__'):
                codes = [codes]  # Only one institute code for this author
            authorInstituteList.append(
                author
                + ',$^{' + ','.join([str(instituteCodes.index(code) + 1)
                                     for code in codes])
                + '}$')
        except KeyError:
            authorInstituteList.append(author + ',')
        try:
            email = authorEmails[author]
            authorInstituteList[-1] += '\thanks{E-mail: \texttt{'
            authorInstituteList[-1] += email + '}}'
        except KeyError:
            pass # No email address for this author
    # Sort out the punctuation (won't work if the penultimate or ultimate
    # author has no institute)
    authorInstituteList[-2] = authorInstituteList[-2].replace(',$', '$')
    authorInstituteList[-2] += ' and'
    authorInstituteList[-1] = authorInstituteList[-1].replace(',$', '$')

    # Put it all together
    authorsString = '\author[' + authorList[0] + ' et al.]'
    authorsString += '\n{\parbox{\textwidth}{'
    authorsString += '\n'.join(authorInstituteList)
    authorsString += '}\vspace{0.4cm}\\\n'
    authorsString += '\parbox{\textwidth}{'
    authorsString += '\\\n'.join(['$^{' + str(iInst + 1) + '}$'
                                    + institutesTex[instituteCodes[iInst]]
                                    for iInst in range(len(instituteCodes))])
    authorsString += '}}\n'

    return authorsString

and the function for A&A:

def getAuthorsStringAA(authorList, authorInstituteCodes, institutesTex,
                       authorEmails):
    """Return a string containing LaTeX for A&A authors list.

    authorList = ["J.~Bloggs", "A.N.~Other"]
    authorInstituteCodes = {"J.~Bloggs":1, "A.N.~Other":[1,"Sussex"]}
    institutesTex = {1:"Somewhere, Earth", "Sussex":"University of Sussex"}
    authorEmails = {"J.~Bloggs": "j.bloggs@no.where"}
    """
    instituteCodes = getSortedInstituteCodes(authorList, authorInstituteCodes)

    # Associate institute numbers with authors and emails with institutes
    authorInstituteList = []  # A list of "Author Name\inst{1,2}" strings
    instituteEmails = {}  # A dictionary of email addresses for each institute
    for author in authorList:
        try:
            codes = authorInstituteCodes[author]
            if not hasattr(codes, '__iter__'):
                codes = [codes]  # Only one institute code for this author
            authorInstituteList.append(
                author + '\inst{'
                + ','.join([str(instituteCodes.index(code) + 1)
                            for code in codes])
                + '}')
            try:
                email = authorEmails[author]
                try:
                    instituteEmails[codes[0]].append(email)
                except KeyError:  # First email address for this institute
                    instituteEmails[codes[0]] = [email]
            except KeyError:
                pass # No email address associated with author
        except KeyError:
            authorInstituteList.append(author)

    # Create a list of "Institute Name, Address\
    #                   \email{j.bloggs@no.where}" strings
    instituteEmailList = []
    for instituteCode in instituteCodes:
        try:
            emails = instituteEmails[instituteCode]
            instituteEmailList.append(
                institutesTex[instituteCode]
                + ''.join(['\\\n\email{' + email + '}' for email in emails]))
        except KeyError:
            instituteEmailList.append(institutesTex[instituteCode])

    # Put it all together
    authorsString = '\author{'
    authorsString += '\n\and '.join(authorInstituteList)
    authorsString += '}\n'
    authorsString += '\institute{'
    authorsString += '\n\and '.join(instituteEmailList)
    authorsString += '}\n'

    return authorsString

Anyone still reading?



comments powered by Disqus