Índice alfabético con hiperenlaces a la página donde se insertó el marcador

Hola a todos.

Desde hace tiempo se ha pedido como característica acorde con los tiempos digitales, que el índice alfabético (de manera similar al índice de contenido) pueda llevar un hiperenlace en la definición de la entrada de cada término que se agrega al índice. Me he sumado a esos feature request, pero aún no se llega a nada concreto.

En el canal de Telegram, nuestro querido @elmau sugirió que podría tenerse dicha funcionalidad usando una macro.

Comparto aquí un documento de muestra en el que he generado un índice de contenido y un índice alfabético. El primero, con los hiperenlaces correspondientes; el segundo, sin la posibilidad de que esto fuera posible.

texto-dummy-con-indices.odt (68.9 KB)

(El texto es solo de muestra y no representa en absoluto ningún interés de mi parte ;D )

1 Like

tdf#71385.

1 Like

Aquí el vínculo a la macro que mencionan en el reporte:
https://de.openoffice.info/viewtopic.php?t=76711

He probado la macro original y funciona correctamente en el archivo, por si quieren probarla, he traducido las etiquetas al español. Hay que importar el modulo BAS y ejecutar la macro “inicio”.

referencias_cruzadas.bas.zip (14.9 KB)

1 Like

Pruebo y te comento. ¿Quizás se podría empaquetar como extensión? Pregunto desde la ignorancia.

Efectivamente, funciona muy bien la macro, al menos con el documento de prueba que incluí.

Gracias, @LeroyG y @elmau por el apoyo. Ya que estamos en el foro en español, marcaré como solución la versión en español de Mau.

1 Like

He hecho unas pequeñas modificaciones a la macro en Basic, he agregado el idioma inglés y español y la he empaquetado como extensión. La tengo lista para publicar en la página de extensiones.

No sé si tú planeabas empaquetar como extensión la macro en Phyton.

  • Lo digo para evitar duplicidades de extensiones.
  • No tengo especial interés en publicar la mía, solo he estado investigando algunas cosillas, pero creo que es interesante y útil que esta macro (en python o basic) se haga públicas
1 Like

No sé cómo hacer extensiones. Tú ya tienes experiencia en eso. En dado caso, si ElMau lo decide y le interesa, la de Python podría ser una extensión diferente. Yo te sugiero que adelante, que por favor la hagas pública. Y si en el texto de la web de la extensión haces la anotación de que hay una versión Python de la misma funcionalidad (remitiendo a esta entrada de Ask), sería de gran ayuda.

Aunque no pienso publicarla, no veo problema en ver dos o más extensiones que hagan lo mismo, creo que siempre es bueno tener opciones. Ninguna de las dos versiones cubre todos los escenarios, pero creo que si le pueden interesar a más de uno. Te animaría a publicar tu extensión en cuanto puedas. Saludos.

1 Like

Aquí una versión con Python usando mi librería EasyMacro que es necesario tener instalada previamente: EasyMacro for LibreOffice

import easymacro as app

def main():

    PREFIX = 'zaz_'
    SEP = '\t'

    doc = app.active
    aindex = None

    for index in doc.indexes:
        if index.is_document_index:
            index.update()
            aindex = index
            break

    for b in reversed(doc.bookmarks):
        if b.name.startswith(PREFIX):
            b.delete()

    marks = {}
    for mark in aindex:
        name = mark.value.replace(' ', '')
        marks[name] = f'{PREFIX}{name}'
        doc.bookmarks.add(marks[name], mark.cursor)


    h = True
    for p in aindex.content:
        if h:
            h = False
            continue
        parts = p.string.split(SEP)
        name = parts[0].replace(' ', '')
        if name in marks:
            data = {
                'Type': 'GetReference',
                'SourceName': marks[name],
                'ReferenceFieldPart': app.ReferenceFieldPart.PAGE,
                'ReferenceFieldSource': app.ReferenceFieldSource.BOOKMARK,
            }
            c = p.cursor
            c.goto_end_of_paragraph(False)
            c.goto_previous_word(True)
            c.value = ''
            doc.fields.add(data, c)

    doc.fields.refresh()
    app.msgbox('Proceso terminado...')

    return

Este código resuelve el problema indicado en este hilo con el archivo anexo al mismo. Para otros tipos y configuraciones es necesario hacer algunos cambios.

2 Likes

¡Creo que lo hace más rápido que el primer script que compartieron! Funcionó sin ningún problema.

¡Muchas gracias!

Para cualquiera interesado, ya están publicadas las macros como una extensión.
AlfabLink » Libreoffice Extensions

  • Al instalar la extensión se añade una entrada AlfabLink al menú Formato y desde ahí se hace la magia.
2 Likes