Anzeige:
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 18

Thema: Abspeichern von Tabellen in eigenem file

  1. #1
    Registrierter Benutzer
    Registriert seit
    13.07.2010
    Beiträge
    83

    Abspeichern von Tabellen in eigenem file

    Hallo ihr TeXfreunde/innen,
    habe folgendes Problem:

    Speichere einen Teil des TeXfiles in ein anderes ab. Das funktioniert tadellos bei mathematischen Zeichen, nicht aber bei Tabellen. Lässt man das Prozentzeichen im Musterbeispiel weg, dann gibt es reihenweise Fehlermeldungen. Primitivabhilfe ist den \ wegzulassen und ihn dann ihm neuen file zu ergänzen, aber das ist wenig texlike.

    Bitte um Ratschläge. Dankr
    Günter

    \documentclass[fontsize=11pt,headings=big,open=any]{scrbook}
    \usepackage[ngerman]{babel}
    \makeatletter
    \newcommand\listofexamples
    {\@starttoc{xmp}}
    \makeatother
    \newcommand{\Aufg}[2]{#1
    \addtocontents{xmp}{#2}\\}%
    \begin{document}
    \Aufg{Text1}{Text2 z.B. $x_i^2$\\}%
    \Aufg{Erster Text}{Text mit Tabelle z.B.\\
    %\begin{tabular}{c}Tabellentext\\ \end{tabular}
    }
    \listofexamples
    \end{document}

  2. #2
    Registrierter Benutzer
    Registriert seit
    09.12.2005
    Beiträge
    1.326
    Du missbrauchst hier \@starttoc und \addtocontents für Dinge, für die sie nicht gedacht sind. Dabei beachtest Du auch nicht, dass das Inhaltsargument von \addtocontents ein moving argument ist, also gilt für zerbrechliche Anweisungen bzw. alle Anweisungen, die beim Schreiben in die aux- und später in die xmp-Datei nicht expandiert werden sollen, mit \protect geschützt werden müssen.

    Ich würde Dir aber schlicht stattdessen zu einem Paket wie filecontents oder einem anderen Paket, um verbatim in eine Datei zu schreiben, raten.

    Übrigens: Code sollte hier im Forum als solcher gekennzeichnet werden. In der Erweitert-Darstellung geht das am einfachsten mit dem #-Knopf in der Toolbar über dem Eingabefeld.

  3. #3
    Registrierter Benutzer
    Registriert seit
    13.07.2010
    Beiträge
    83
    Danke für die rasche Antwort.
    In verbatim zu speichern wäre optimal - die Tabellenumgebung ist ja nur ein Beispiel, wo es nicht funktioniert -, aber filecontents sammelt nicht die verschiedenen files in eines und bei meinem Problem handelt sich um mehrere hundert Anhänge. Kennt jemand ein package, dass die files in verbatim speichert, sammelt und als ein file ausgibt?
    Danke

  4. #4
    Registrierter Benutzer Avatar von mechanicus
    Registriert seit
    10.07.2008
    Ort
    Hamburg
    Beiträge
    3.944
    Hi,

    vielleicht solltest du genau beschreiben, was du möchtest. Bisher habe ich es noch nicht verstanden. Was soll eigentlich mit dem Inhalt passieren? Willst du es anhängen (attach)?

    Marco

  5. #5
    Registrierter Benutzer
    Registriert seit
    13.07.2010
    Beiträge
    83
    Ich schreibe an einer Aufgabensammlung und die Lösungen stehen jeweils bei den Aufgaben. Dadurch können die Aufgaben leicht verschoben werden oder auch neue dazu gefügt werden. Die Lösungen hätte ich gerne beim TeXdurchlauf in ein eigenes file gesammelt, dass ich dann bearbeiten kann. Bei den Lösungen gibt es Tabellen, Aufzählungen, Grafiken etc.

  6. #6
    Registrierter Benutzer
    Registriert seit
    09.12.2005
    Beiträge
    1.326
    Es würde mich sehr wundern, wenn es das noch nicht als Paket gäbe. Notfalls könnte man sich das mit Hilfe des moreverb-Pakets einfach selbst basteln:
    Code:
    \documentclass[fontsize=11pt,headings=big,open=any]{scrbook}
    \usepackage[ngerman]{babel}
    \usepackage{moreverb}
    
    \makeatletter
    \newenvironment{examplefile}[1]{%
      \@bsphack
      \@ifundefined{verbatim@out@#1}{%
        \expandafter\newwrite\csname verbatim@out@#1\endcsname
        \expandafter\show\csname verbatim@out@#1\endcsname
        \expandafter\immediate\expandafter\openout \csname
        verbatim@out@#1\endcsname #1
      }{%
        % Am Anfang jedes Beispiels schreiben wir eine Leerzeile, um einen neuen
        % Absatz zu beginnen:
        \expandafter\immediate\expandafter\write \csname verbatim@out@#1\endcsname
        {}%
      }%
      \let\do\@makeother\dospecials
      \catcode`\^^M\active \catcode`\^^I=12
      \def\verbatim@processline{%
        \expandafter\immediate\expandafter\write\csname verbatim@out@#1\endcsname
          {\the\verbatim@line}}%
      \verbatim@start
    }{%
      \@esphack
    }  
    \newcommand*{\inputexamples}[1]{%
      \@ifundefined{verbatim@out@#1}{}{%
        \expandafter\immediate\expandafter\closeout
        \csname verbatim@out@#1\endcsname
        \expandafter\let\csname verbatim@out@#1\endcsname\relax
      }%
      \InputIfFileExists{#1}{\typeout{Example file `#1' read.}}{%
        \typeout{Example file `#1' not found.}%
      }%
    }
    \makeatother
    
    \usepackage{lipsum}% Für Demozwecke ganz nützlich.
    
    \begin{document}
    \lipsum[1]
    \begin{examplefile}{\jobname.xmp}
      Text1
    \end{examplefile}
    \lipsum[2]
    \begin{examplefile}{\jobname.xmp}
      Noch ein Text mit Tabelle
      \begin{tabular}{c}Tabellentext\\\end{tabular}
    \end{examplefile}
    \lipsum[3]
    \inputexamples{\jobname.xmp}
    \end{document}
    Falls man nicht will, dass jede examplefile-Umgebung einen neuen Absatz beginnt, kann man die entsprechenden beiden Zeilen (siehe Kommentar) auch auskommentieren. Dann muss man für Absätze in der xmp-Datei selbst sorgen.

    Die Umgebung ist so angelegt, dass man unterschiedliche Dateien verwenden kann. Allerdings wird man dann sehr schnell in der "no room for new write"-Problem laufen.

  7. #7
    Registrierter Benutzer
    Registriert seit
    13.07.2010
    Beiträge
    83
    Herzlichen Dank. Das Ganze funktioniert auch unter lualatex.

  8. #8
    Registrierter Benutzer Avatar von mechanicus
    Registriert seit
    10.07.2008
    Ort
    Hamburg
    Beiträge
    3.944
    Zitat Zitat von G.Hanisch Beitrag anzeigen
    Herzlichen Dank. Das Ganze funktioniert auch unter lualatex.
    Wenn du sowieso mit Lua arbeitetst, dann kannst du auch mit io.open spielen. Das spart wohl eindeutig TeX Speicher.

    Marco

  9. #9
    Registrierter Benutzer
    Registriert seit
    13.07.2010
    Beiträge
    83
    Habe mich leider zu früh gefreut, die Umgebung kann nicht in ein neues Makro gesteckt werden: Ich habe \newcommand{\Aufg}[2]{#1 \begin{examplefile}{\jobname.xmp} #2 \end{examplefile}} für \Aufg{Aufgabentext}{Lösungstext} eingefügt und das klappt dann leider nicht.

    Code:
    \documentclass[fontsize=11pt,headings=big,open=any]{scrbook}
    \usepackage[ngerman]{babel}
    \usepackage{moreverb}
    
    \makeatletter
    \newenvironment{examplefile}[1]{%
      \@bsphack
      \@ifundefined{verbatim@out@#1}{%
        \expandafter\newwrite\csname verbatim@out@#1\endcsname
        \expandafter\show\csname verbatim@out@#1\endcsname
        \expandafter\immediate\expandafter\openout \csname
        verbatim@out@#1\endcsname #1
      }{%
        % Am Anfang jedes Beispiels schreiben wir eine Leerzeile, um einen neuen
        % Absatz zu beginnen:
        \expandafter\immediate\expandafter\write \csname verbatim@out@#1\endcsname
        {}%
      }%
      \let\do\@makeother\dospecials
      \catcode`\^^M\active \catcode`\^^I=12
      \def\verbatim@processline{%
        \expandafter\immediate\expandafter\write\csname verbatim@out@#1\endcsname
          {\the\verbatim@line}}%
      \verbatim@start
    }{%
      \@esphack
    }  
    \newcommand*{\inputexamples}[1]{%
      \@ifundefined{verbatim@out@#1}{}{%
        \expandafter\immediate\expandafter\closeout
        \csname verbatim@out@#1\endcsname
        \expandafter\let\csname verbatim@out@#1\endcsname\relax
      }%
      \InputIfFileExists{#1}{\typeout{Example file `#1' read.}}{%
        \typeout{Example file `#1' not found.}%
      }%
    }
    \makeatother
    
    \newcommand{\Aufg}[2]{#1 \begin{examplefile}{\jobname.xmp}  #2 \end{examplefile}}
    \usepackage{lipsum}% Für Demozwecke ganz nützlich.
    
    \begin{document}
    \Aufg{\lipsum[1]}
    %\begin{examplefile}{\jobname.xmp}
      {Text1}
    %\end{examplefile}
    \end{document}

  10. #10
    Registrierter Benutzer
    Registriert seit
    09.12.2005
    Beiträge
    1.326
    Das kann auch nicht klappen, weil moreverb im Text nach dem Ende der Umgebung scannt, das aber Teil einer Expansion wäre, was nicht funktionieren kann. Aber das kann so ohnehin nicht funktionieren, weil verbatim lesen nur beim Scannen funktioniert. Wenn aber der Text, der verbatim geschrieben werden soll in einem Argument steckt, dann wurde er bereits nicht verbatim gelesen ist also nicht mehr verbatim. Fazit: Arbeite mit Umgebungen! Beispielsweise so:
    Code:
    \documentclass[fontsize=11pt,headings=big,open=any]{scrbook}
    \usepackage[ngerman]{babel}
    \usepackage{moreverb}
    
    \makeatletter
    \newenvironment{examplefile}[1]{%
      \@bsphack
      \@ifundefined{verbatim@out@#1}{%
        \expandafter\newwrite\csname verbatim@out@#1\endcsname
        \expandafter\show\csname verbatim@out@#1\endcsname
        \expandafter\immediate\expandafter\openout \csname
        verbatim@out@#1\endcsname #1
      }{%
        % Am Anfang jedes Beispiels schreiben wir eine Leerzeile, um einen neuen
        % Absatz zu beginnen:
        \expandafter\immediate\expandafter\write \csname verbatim@out@#1\endcsname
        {}%
      }%
      \let\do\@makeother\dospecials
      \catcode`\^^M\active \catcode`\^^I=12
      \def\verbatim@processline{%
        \expandafter\immediate\expandafter\write\csname verbatim@out@#1\endcsname
          {\the\verbatim@line}}%
      \verbatim@start
    }{%
      \@esphack
    }
    \newenvironment{Aufg}{%
      \par
    }{%
      \par
    }
    \newenvironment{Exmpl}{%
      \examplefile{\jobname.xmp}
    }{%
      \endexamplefile
    }
    \newcommand*{\inputexamples}[1]{%
      \@ifundefined{verbatim@out@#1}{}{%
        \expandafter\immediate\expandafter\closeout
        \csname verbatim@out@#1\endcsname
        \expandafter\let\csname verbatim@out@#1\endcsname\relax
      }%
      \InputIfFileExists{#1}{\typeout{Example file `#1' read.}}{%
        \typeout{Example file `#1' not found.}%
      }%
    }
    \makeatother
    
    \usepackage{lipsum}% Für Demozwecke ganz nützlich.
    
    \begin{document}
    \begin{Aufg}
    \lipsum
    % Alternativ kann man die Umgebung Aufg bereits hier beenden.
    \begin{Exmpl}
      Text1
    \end{Exmpl}
    \end{Aufg}
    \end{document}
    Ich finde das so übrigens viel sauberer als große Mengen Text in eine Argument zu packen.

  11. #11
    Registrierter Benutzer
    Registriert seit
    13.07.2010
    Beiträge
    83
    Danke und du hast natürlich Recht. Leider sind aber 200 Seiten bereits anders gesetzt. Das lässt sich für den Anfangsteil der Umgebung mit "Suchen - Ersetzen" ausbessern, der Rest muss aber händisch passieren.

    Es funktioniert auch mit Lualatex, die Möglichkeit mit io.open muss ich noch nachschlagen.

    Nochmals besten Dank

    Günter

  12. #12
    ctansearch
    Gast
    Wenn Du ein kleines, lauffähiges Minimalbeispiel einbringst, in dem die auszugeliedernden Texte lauffähig drin stehen, hätte ich eventuell eine Möglichkeit anzubieten.

  13. #13
    Registrierter Benutzer
    Registriert seit
    09.12.2005
    Beiträge
    1.326
    Nach einer halb schlaflosen Nacht ist mir eine Lösung eingefallen, die so simpel ist, dass es fast schon weh tut, dass ich darauf nicht früher gekommen bin:
    Code:
    \documentclass[fontsize=11pt,headings=big,open=any]{scrbook}
    \usepackage[ngerman]{babel}
    \newwrite\xmpfile
    \immediate\openout\xmpfile \jobname.xmp
    \newcommand\writexmp[1]{%
      \immediate\write\xmpfile{%
        \detokenize{#1}
        ^^J% Leerzeile anhängen
      }%
    }
    \newcommand{\Aufg}[2]{#1%
      \writexmp{#2}\\}%
    \begin{document}
    \Aufg{Text1}{Text2 z.B. $x_i^2$\\}%
    \Aufg{Erster Text}{Text mit Tabelle z.B.\\
      \begin{tabular}{c}Tabellentext\\ \end{tabular}
    }
    \immediate\closeout\xmpfile\input{\jobname.xmp}
    \end{document}
    Die ganzen \\ würde ich an Deiner Stelle aber noch rausnehmen. Bis auf innerhalb der Tabelle sind die nämlich schlicht falsch!

    Ansonsten: Wen ich Dich richtig verstehe, willst Du eigentlich aus einem Quelldokument quasi zwei Dokumente generieren. Da käme (für die Zukunft) generell auch ein docstrip-basierter Ansatz in Frage.

  14. #14
    Registrierter Benutzer
    Registriert seit
    13.07.2010
    Beiträge
    83
    Wirklich ganz herzlichen Dank. Ich habe bereits mein sty-file umgestellt und das Dokument durchlaufen lassen (in LuaLaTex). Nun kann ich meine Sternchen in \ umwandeln bzw. Texte, die ich - weil sie Fehler ergeben haben und ich die Sternchenidee noch nicht hatte - unter comment geschrieben habe, wieder "entcommentieren".

    Da mein Problem aber doch alle haben, die Skripten mit Aufgaben und deren Lösungen herstellen, könntest du aus deiner Superidee nicht ein package machen und es anbieten?

    Eine Frage noch: Warum ist \\ falsch? Ich stelle dadurch eine neue Zeile her.

    Günter

  15. #15
    Registrierter Benutzer
    Registriert seit
    06.03.2010
    Ort
    St. Petersburg, Russland
    Beiträge
    2.468
    \\ stellt eine neue Zeile her, OHNE den Absatz zu beenden. Das ist nur in Ausnahmenfällen erwünscht. Sonst sollte man mit einer Leerzeile im Code oder mit \par einen neuen Absatz beginnen.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •