LaTeX vs. GEDCOM – sowie allgm. Informationen zu Einbindung mit/in TeX

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • urmel_x
    Erfahrener Benutzer
    • 26.06.2015
    • 106

    #31
    @gki

    Hi,

    ich denke, als erstes sollte geklärt werden - und dazu reicht erst mal einfaches Text-Format - welche Daten unbedingt dargestellt werden sollen und dann noch eine grobe Struktur des ganzen. Anschließend kann man mit LaTex oder HTML und CSS die Formatierung machen. Als Sortierung der Familien würde ich die Kekule-Zahlen empfehlen. Ich selber fasse gern alle Familien zusammen, die zu einem Ahnen gehören - sprich der Ahne mit seinen Partnern samt den entsprechenden Kindern und den Ehepartnern der Kinder.

    Und jetzt versuche ich mal die aktuelle XSL-Datei anzuhängen:

    Code:
    <?xml version="1.0" encoding="iso-8859-1"?>
    
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
    <xsl:output method="text" indent="yes" encoding="ISO-8859-1" omit-xml-declaration="no"/>
    
    <xsl:template match="/">
        <xsl:apply-templates select="*"/>
    </xsl:template>
    
    <xsl:template match="*:database">
        <xsl:apply-templates select="*:families" />
        <!-- <xsl:apply-templates select="*:people" /> -->
    </xsl:template>
    
    <xsl:template match="*:people">
        <xsl:apply-templates select="*:person" />
    </xsl:template>
    
    <xsl:template match="*:person">
        <xsl:apply-templates select="*:name" />
        <xsl:text>
    </xsl:text>
    </xsl:template>
    
    <xsl:template match="*:name">
        <xsl:choose>
            <xsl:when test="@type='Birth Name'">
                <xsl:value-of select="*:surname" />
            </xsl:when>
            <xsl:otherwise>
                <xsl:text>???</xsl:text>
            </xsl:otherwise>
        </xsl:choose>
        <xsl:text>, </xsl:text>
        <xsl:value-of select="*:first" />
    </xsl:template>
    
    <xsl:template match="*:families">
        <xsl:apply-templates select="*:family" />
    </xsl:template>
    
    <xsl:template match="*:family">
        <xsl:if test="*:father">
            <xsl:call-template name="search_person">
                <xsl:with-param name="hlink" select="*:father/@hlink" />
            </xsl:call-template>
    <xsl:text>
    </xsl:text>
        </xsl:if>
        <xsl:if test="*:mother">
            <xsl:call-template name="search_person">
                <xsl:with-param name="hlink" select="*:mother/@hlink" />
            </xsl:call-template>
    <xsl:text>
    </xsl:text>
        </xsl:if>
        <xsl:for-each select="*:childref">
            <xsl:text>      - </xsl:text>
            <xsl:call-template name="search_person">
                <xsl:with-param name="hlink" select="@hlink" />
            </xsl:call-template>
    <xsl:text>
    </xsl:text>
        </xsl:for-each>
    <xsl:text>
    </xsl:text>
    </xsl:template>
    
    <xsl:template name="search_person">
        <xsl:param name="hlink" />
    
        <xsl:apply-templates select="/descendant::*:person[$hlink=@handle]/*:name" />
    </xsl:template>
    
    </xsl:stylesheet>

    Kommentar

    • gki
      Erfahrener Benutzer
      • 18.01.2012
      • 4823

      #32
      Hallo Urmel!

      Zitat von urmel_x Beitrag anzeigen
      ich denke, als erstes sollte geklärt werden - und dazu reicht erst mal einfaches Text-Format - welche Daten unbedingt dargestellt werden sollen und dann noch eine grobe Struktur des ganzen.
      Ich denke, da werden wir es nie allen recht machen können. Von daher sollte man das den Endbenutzern überlassen. Ideal wären gewisse LaTeX-Befehle in einer Klasse zu definieren, die dann aufgerufen werden könnten.

      Also etwa

      \gentree[3]{P00001}

      würde dann den Stammbaum von der Person mit der Gramps-ID P00001 auf drei Generationen an der Stelle ausgeben.

      Der würde natürlich ein gewisses Standard-Layout haben, was dann evtl. durch zusätzliche Befehle angepaßt werden könnte.

      Die LaTeX-Makros würden dann Saxon (geht xsltproc auch?) aufrufen, um die Daten aus dem XML zu saugen.

      Dadurch würden die Endbenutzer nur LaTeX anwenden müssen, nicht auch noch XSL.

      Und jetzt versuche ich mal die aktuelle XSL-Datei anzuhängen:
      Vielen Dank!

      Allein: ich kann sie nicht anwenden... Irgendwas mach ich wohl falsch...

      saxonb-xslt -s:gki.xml -xsl:gramps_latex.xsl

      gramps_latex.xsl ist Deine Datei, gki.xml meine Daten als ausgepacktes Gramps-XML.


      Error on line 1 column 3 of grampsxml.dtd:
      SXXP0003: Error reported by XML parser: The markup declarations contained or pointed to by
      the document type declaration must be well-formed.
      Transformation failed: Run-time errors were reported

      Er nölt an der grampsxml.dtd rum, die das XML ja referenziert. Merkwürdig. Ne Idee?
      Gruß
      gki

      Kommentar

      • urmel_x
        Erfahrener Benutzer
        • 26.06.2015
        • 106

        #33
        Zitat von gki Beitrag anzeigen
        Error on line 1 column 3 of grampsxml.dtd:
        SXXP0003: Error reported by XML parser: The markup declarations contained or pointed to by
        the document type declaration must be well-formed.
        Transformation failed: Run-time errors were reported
        Hab ich auch - einfach Zeile 2 der XML-Datei löschen, die anfängt mit

        <!DOCTYPE ...

        Die braucht man nicht wirklich - da stimmt entweder beim XSL-Prozessor was nicht oder bei GRAMPS.

        Gruß,

        Urmel.

        Kommentar

        • urmel_x
          Erfahrener Benutzer
          • 26.06.2015
          • 106

          #34
          Zitat von gki Beitrag anzeigen
          Ich denke, da werden wir es nie allen recht machen können. Von daher sollte man das den Endbenutzern überlassen. Ideal wären gewisse LaTeX-Befehle in einer Klasse zu definieren, die dann aufgerufen werden könnten.
          Man kann dem XSL-Prozessor (z.B. Saxon) beim Kommando-Aufruf Parameter mitgeben, welche die Ausgabe der XSL-Transformation steuern. Der Nutzer sollte das XSL-Script nicht ändern müssen - es wird für viele Nutzer schon schwer genug sein, Java, Saxon (o.ä.) und LaTex zu installieren.

          Gruß,

          Urmel.

          Kommentar

          • gki
            Erfahrener Benutzer
            • 18.01.2012
            • 4823

            #35
            Hallo Urmel,

            den Nutzer die Gramps-Datei bearbeiten zu lassen ist irgendwie keine Lösung, das müßte man anders lösen. Ich hab etwas gegoogelt, das schein allerdings kompliziert zu sein.

            Ich würde den Nutzer auch eher vom XSLT abkapseln wollen. Ich denke, daß LaTeX da eine etwas (aber auch nur etwas) freundlichere Unser-Interaktion zu bieten hat.
            Gruß
            gki

            Kommentar

            • urmel_x
              Erfahrener Benutzer
              • 26.06.2015
              • 106

              #36
              Ich habe jetzt als Beispiel das Script erweitert um eine Parametereingabe, mit der man zu einer Person und deren Kekule-Nummer eine Liste der Vorfahren mi deren Kekule-Nummer ausgeben kann á la

              kekule-nr.: name, vornam(en)

              mittels

              java net.sf.saxon.Transform -s:data.gramps -xsl:gramps.xsl PROBAND=personen-id-aus-gramps KEKULE=gewünschte-start-nummer

              Code:
              <?xml version="1.0" encoding="iso-8859-1"?>
              
              <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
              
              <xsl:output method="text" indent="yes" encoding="ISO-8859-1" omit-xml-declaration="no"/>
              
              <xsl:param name="PROBAND" />
              <xsl:param name="KEKULE" />
              
              <xsl:template match="/">
                  <xsl:choose>
                      <xsl:when test="$PROBAND and $KEKULE">
                          <xsl:variable name="kekule">
                              <xsl:call-template name="make_kekule">
                                  <xsl:with-param name="proband_ID" select="$PROBAND" />
                                  <xsl:with-param name="kekule_nr" select="$KEKULE" />
                              </xsl:call-template>
                          </xsl:variable>
                          <xsl:variable name="database" select="/*:database" />
                          <xsl:for-each select="$kekule/kekule/numbers/person">
                              <xsl:value-of select="@kekule" />
                              <xsl:text>: </xsl:text>
                              <xsl:call-template name="person_by_id">
                                  <xsl:with-param name="person" select="@id" />
                                  <xsl:with-param name="database" select="$database" />
                              </xsl:call-template>
                          </xsl:for-each>
                      </xsl:when>
                      <xsl:otherwise>
                          <xsl:apply-templates select="*"/>
                      </xsl:otherwise>
                  </xsl:choose>
              </xsl:template>
              
              <xsl:template match="*:database">
                  <xsl:apply-templates select="*:families" />
                  <!-- <xsl:apply-templates select="*:people" /> -->
              </xsl:template>
              
              <xsl:template match="*:people">
                  <xsl:apply-templates select="*:person" />
              </xsl:template>
              
              <xsl:template match="*:person">
                  <xsl:apply-templates select="*:name" />
                  <xsl:text>
              </xsl:text>
              </xsl:template>
              
              <xsl:template match="*:name">
                  <xsl:choose>
                      <xsl:when test="@type='Birth Name'">
                          <xsl:value-of select="*:surname" />
                      </xsl:when>
                      <xsl:otherwise>
                          <xsl:text>???</xsl:text>
                      </xsl:otherwise>
                  </xsl:choose>
                  <xsl:text>, </xsl:text>
                  <xsl:value-of select="*:first" />
              </xsl:template>
              
              <xsl:template match="*:families">
                  <xsl:apply-templates select="*:family" />
              </xsl:template>
              
              <xsl:template match="*:family">
                  <xsl:if test="*:father">
                      <xsl:call-template name="search_person">
                          <xsl:with-param name="hlink" select="*:father/@hlink" />
                      </xsl:call-template>
              <xsl:text>
              </xsl:text>
                  </xsl:if>
                  <xsl:if test="*:mother">
                      <xsl:call-template name="search_person">
                          <xsl:with-param name="hlink" select="*:mother/@hlink" />
                      </xsl:call-template>
              <xsl:text>
              </xsl:text>
                  </xsl:if>
                  <xsl:for-each select="*:childref">
                      <xsl:text>      - </xsl:text>
                      <xsl:call-template name="search_person">
                          <xsl:with-param name="hlink" select="@hlink" />
                      </xsl:call-template>
              <xsl:text>
              </xsl:text>
                  </xsl:for-each>
              <xsl:text>
              </xsl:text>
              </xsl:template>
              
              <xsl:template name="search_person">
                  <xsl:param name="hlink" />
              
                  <xsl:apply-templates select="/descendant::*:person[$hlink=@handle]/*:name" />
              </xsl:template>
              
              <xsl:template name="person_by_id">
                  <xsl:param name="person" />
                  <xsl:param name="database" />
                  <xsl:apply-templates select="$database/*:people/*:person[@id=$person]" />
              </xsl:template>
              
              <xsl:template name="make_kekule">
                  <xsl:param name="proband_ID" select="I0000" />
                  <xsl:param name="kekule_nr" select="1" />
              
                  <xsl:variable name="kekule">
                      <kekule>
                          <xsl:call-template name="kekule">
                              <xsl:with-param name="person_ID" select="$proband_ID" />
                              <xsl:with-param name="kekule_nr" select="$kekule_nr" />
                          </xsl:call-template>
                      </kekule>
                  </xsl:variable>
                  <kekule>
                      <numbers>
                          <xsl:for-each select="$kekule/kekule/person">
                              <xsl:sort select="@kekule" data-type="number" />
                              <xsl:copy-of select="." />
                          </xsl:for-each>
                      </numbers>
                      <people>
                          <xsl:for-each-group select="$kekule/kekule/person" group-by="@id">
                              <person id="{@id}">
                                  <xsl:for-each select="current-group()">
                                      <xsl:sort select="@kekule" data-type="number" />
                                      <nr><xsl:value-of select="@kekule"/></nr>
                                  </xsl:for-each>
                              </person>
                          </xsl:for-each-group>
                      </people>
                  </kekule>
              </xsl:template>
              
              <xsl:template name="kekule">
                  <xsl:param name="person_ID" />
                  <xsl:param name="kekule_nr" />
              
                  <xsl:variable name="person" select="/*/*:people/*:person[@id=$person_ID]" />
              
                  <xsl:if test="$person">
                      <person id="{$person_ID}" kekule="{$kekule_nr}" />
                      <xsl:variable name="childof" select="$person/*:childof" />
                      <xsl:if test="$childof">
                          <xsl:variable name="family" select="/*/*:families/*:family[@handle=$childof/@hlink]" />
                          <xsl:if test="$family">
                              <xsl:if test="$family/*:father">
                                  <xsl:variable name="father" select="/*/*:people/*:person[@handle=$family/*:father/@hlink]" />
                                  <xsl:if test="$father">
                                      <xsl:call-template name="kekule">
                                          <xsl:with-param name="person_ID" select="$father/@id" />
                                          <xsl:with-param name="kekule_nr" select="$kekule_nr * 2" />
                                      </xsl:call-template>
                                  </xsl:if>
                              </xsl:if>
                              <xsl:if test="$family/*:mother">
                                  <xsl:variable name="mother" select="/*/*:people/*:person[@handle=$family/*:mother/@hlink]" />
                                  <xsl:if test="$mother">
                                      <xsl:call-template name="kekule">
                                          <xsl:with-param name="person_ID" select="$mother/@id" />
                                          <xsl:with-param name="kekule_nr" select="$kekule_nr * 2 + 1" />
                                      </xsl:call-template>
                                  </xsl:if>
                              </xsl:if>
                          </xsl:if>
                      </xsl:if>
                  </xsl:if>
              </xsl:template>
              
              </xsl:stylesheet>

              Kommentar

              • gki
                Erfahrener Benutzer
                • 18.01.2012
                • 4823

                #37
                Hallo Urmel,

                funktioniert super!

                Ich werd mich mal bemühen, ein paar LaTeX-Formatierungen einzubauen.

                Mich würde interessieren, von anderen zu hören, ob sie diese Vorgehensweise für sinnvoll erachten.
                Gruß
                gki

                Kommentar

                • gki
                  Erfahrener Benutzer
                  • 18.01.2012
                  • 4823

                  #38
                  So, anbei die modifizierte XSL-Datei (als .txt) und eine Beispielausgabe. Ich habe jede Person auf eine Seite getan, einfach damit der Index nicht nur auf eine Seite verweist.
                  Angehängte Dateien
                  Gruß
                  gki

                  Kommentar

                  • urmel_x
                    Erfahrener Benutzer
                    • 26.06.2015
                    • 106

                    #39
                    @gki

                    Super zurecht gefunden! Ich persöhnlich würde die Aufteilung Familien-orientiert anlegen wollen, d.h. jedes Familienoberhaupt - also jede gerade Kekule-Nummer - erhält einen Seitenanfang mit Partnerinnen und Kindern etc.

                    Die bisherigen Scripts sollen ja nur eine grobe Orientierung geben und die Möglichkeiten andeuten - ich werde mal als nächstes eine Familienorientierte Auflistung angehen - sortiert nach Kekule.

                    Man kann ja wie gesagt Optionen an das Script übergeben, was man haben will und wie es ausgegeben werden soll - muss halt ins Script programmieert werden.

                    Gruß,

                    Urmel.

                    Kommentar

                    • urmel_x
                      Erfahrener Benutzer
                      • 26.06.2015
                      • 106

                      #40
                      @gki

                      Ich habe das letzte Script von mir noch einmal umstrukturiert und das LaTex eingearbeitet - bitte überprüfen!

                      Vieleicht versuche ich doch erstmal die GRAMPS-Beziehungen pro Person darzustellen?

                      Gruß,

                      Urmel.
                      Angehängte Dateien

                      Kommentar

                      • urmel_x
                        Erfahrener Benutzer
                        • 26.06.2015
                        • 106

                        #41
                        Erweitertes Beispiel - formatiert mit HTML durch MODE=HTML:

                        java net.sf.saxon.Transform -s:data.gramps -xsl:gramps_xsl.txt PROBAND=I0000 KEKULE=1 MODE=HTML > index.html
                        Angehängte Dateien

                        Kommentar

                        • urmel_x
                          Erfahrener Benutzer
                          • 26.06.2015
                          • 106

                          #42
                          letzter Stand für HTML-Formatierung:

                          java net.sf.saxon.Transform -s:data.gramps -xsl:gramps_xsl.txt PROBAND=personen-id-aus-gramps KEKULE=gewünschte-start-nummer MODE=HTML > index.html

                          alles noch ohne Verlinkung innerhalb der dargestellten Daten ...
                          Angehängte Dateien

                          Kommentar

                          • urmel_x
                            Erfahrener Benutzer
                            • 26.06.2015
                            • 106

                            #43
                            @gki

                            LaTex kann ich nicht selber einarbeiten

                            @all

                            index.html.txt muss zurückbenannt werden in index.html - die txt-Endung ist technisch bedingt.

                            Der letzte Stand des Scripts ist jetzt mit Partner- und Kinder-Angabe, immer noch ohne Links und ohne Lebensdaten der Nebenpersonen.
                            Angehängte Dateien

                            Kommentar

                            • petjo
                              Benutzer
                              • 03.10.2016
                              • 6

                              #44
                              Hallo urmel_x und gki,
                              mische mich nochmal in die Diskussion.
                              Verstehe von XLS und den anderen Sachen relativ wenig.

                              Damit ich mit meinen Arbeiten zum Familienbuch weiterkomme, benutze ich ich weiter AGES und achte bei der Eingabe darauf, dass ich mit den bisherigen Möglichkeiten von AGES einen befriedigenden Export zu LaTeX hinbekomme.

                              Seit kurzem gibt es ein LaTeX-Packet 'genealogytree' (https://www.ctan.org/pkg/genealogytree), das gutaussehende grafische Stammbäume ausdruckt.

                              Beispiel: siehe Anhang

                              Ideal wäre es, aus einer GEDCOM-Datei (am besten aus dem AGES-Standard) die Daten in dieses Packet einlesen zu können. Aber vielleicht muss ich mit damit an den Autor dieses Packetes wenden. Ich könnte mir vorstellen, dass dies mit LUA und LuaLaTeX zu bewerkstelligen ist. Allerdings bin ich dafür zu sehr Hobbyprogrammierer, als dass ich das hinkriegte.

                              Gruss petjo
                              Angehängte Dateien

                              Kommentar

                              • gki
                                Erfahrener Benutzer
                                • 18.01.2012
                                • 4823

                                #45
                                Hallo Urmel,

                                die Fortschritte sind klasse! Ich baue auch gern LaTeX ein - wenn es denn jemand benutzen will.

                                Ich bin mir nicht sicher, ob das hier nicht "am Markt vorbei" ist. Schon das editieren der Gramps-Datei um die Referenz auf das DTD zu entfernen dürfte die meisten Nutzer überfordern.
                                Gruß
                                gki

                                Kommentar

                                Lädt...
                                X