Der Inhalt einer externen Datei soll zur weiteren Verarbeitung zeilenweise in einer expl3-Sequenz gespeichert werden. Dies kann zwar mit dem folgenden Code geschehen, doch stört mich daran, dass

  1. offenbar an den Inhalt jeder Zeile ein Leerzeichen angefügt wird,
  2. der Befehl \ior_map_inline:Nn experimentell ist und somit jederzeit geändert oder gestrichen werden kann.

Geht das noch besser?

Open in Online-Editor
\documentclass{article}
\usepackage{expl3}
\usepackage{xparse}

\begin{filecontents*}{Datei}
Mueller
Meyer
Schulze
Schmidt
machen allen Unsinn mit
\end{filecontents*}

\ExplSyntaxOn

\ior_new:N \l_datei_stream
\seq_new:N \l_dateiinhalt_seq

\cs_new:Npn \lies_dateiinhalt:n #1
    {
        \ior_open:Nn \l_datei_stream {#1}
        \ior_map_inline:Nn \l_datei_stream
            {
                \seq_put_right:Nn \l_dateiinhalt_seq {##1}
            }
        \ior_close:N \l_datei_stream
        \seq_use:Nn \l_dateiinhalt_seq {\slash}
    }

\NewDocumentCommand \Dateiinhalt {m}
    {
        \lies_dateiinhalt:n {#1}
    }

\ExplSyntaxOff

\begin{document}
\Dateiinhalt{Datei}
\end{document}

gefragt 27 Mai '16, 23:42

Cletus's gravatar image

Cletus
1.6k75866
Akzeptiert-Rate: 75%

bearbeitet 28 Mai '16, 11:14

cgnieder's gravatar image

cgnieder
22.1k253463


Ganz ohne experimentelle Funktionen, ohne störende Leerzeichen am Ende und ohne vollständige Expansion des Dateiinhalts. So können auch Makros gelesen werden.

Open in Online-Editor
\documentclass{article}
\usepackage{expl3}
\usepackage{xparse}

\begin{filecontents*}{Datei}
Mueller
Meyer
\textbf{Schulze}
Schmidt
machen allen Unsinn mit
\end{filecontents*}

\ExplSyntaxOn

\ior_new:N \l_datei_stream
\seq_new:N \l_dateiinhalt_seq

\cs_new:Npn \lies_dateiinhalt:n #1
 {
  \ior_open:Nn \l_datei_stream {#1}
  \bool_until_do:nn { \ior_if_eof_p:N \l_datei_stream }
   {
    \ior_get:NN \l_datei_stream \l_tmpa_tl
    \tl_trim_spaces:N \l_tmpa_tl
    \seq_put_right:NV \l_dateiinhalt_seq \l_tmpa_tl
   }
  \ior_close:N \l_datei_stream
  \seq_use:Nn \l_dateiinhalt_seq {\slash}
 }

\NewDocumentCommand \Dateiinhalt {m}
 {
  \lies_dateiinhalt:n {#1}
 }

\ExplSyntaxOff

\begin{document}
\Dateiinhalt{Datei}
\end{document}

alt text

Permanenter link

beantwortet 28 Mai '16, 11:29

Henri's gravatar image

Henri
15.7k133943
Akzeptiert-Rate: 46%

bearbeitet 28 Mai '16, 11:37

„vor allem ohne vollständige Expansion“ – das ist ja weder im OP noch in meinem Kommentar ein Problem. Interface3 zu \tl_trim_spaces:n: „TeXhackers note: The result is returned within unexpanded, which means that the token list will not expand further when appearing in an x-type argument expansion.

(28 Mai '16, 11:33) cgnieder

@Clemens Sorry, ich sollte die Doku wohl aufmerksamer lesen.

(28 Mai '16, 11:34) Henri

Der Vorschlag ist interessant, scheint aber den Schönheitsfehler zu haben, dass am Ende noch eine leere Zeile eingelesen wird, wie man am abschließenden Schrägstrich erkennen kann. Es ist also noch etwas Nacharbeit nötig, wenn man das vermeiden will.

(28 Mai '16, 19:09) Cletus

Clemens, was ist denn ein OP? Operationssaal?

(28 Mai '16, 19:11) Cletus

Originalpost, in diesem Fall Deine Frage oben. Ist eigentlich eine englische Abkürzung und kann sich sowohl auf die Frage als auch den/die Fragesteller/in beziehen.

(28 Mai '16, 19:51) cgnieder

@Cletus Das ist in der Tat kein Fehler, da filecontents* auf meinem System die Datei mit einer leeren Zeile beendet. Die wird natürlich auch mit eingelesen und ausgegeben.

(29 Mai '16, 17:19) Henri
Ergebnis 5 von 6 show 1 more comments

Ich finde eigentlich nicht, dass Du die experimentelle Funktion unbedingt vermeiden musst, vor allem, wenn man folgende Hinweise aus l3candiates bedenkt:

  • Discussing and understanding use cases for a particular addition or concept also helps to ensure that we provide the right interfaces in the final version so please give us feedback if you consider a certain candidate function useful (or not).

We only add functions in this space if we consider them being serious candidates for a final inclusion into the kernel. However, real use sometimes leads to better ideas, so functions from this module are not necessarily stable and we may have to adjust them!

Die Funktionen können sich zwar ändern, aber nicht notwendigerweise in drastischer Form. Wenn man mit expl3 arbeitet, muss man so oder so darauf gefasst sein, dass es Änderungen gibt. Ich musste meine Pakete schon ein, zwei mal updaten wegen einer Änderung am Kernel, die nicht aus dem candidates-teil waren.

Auf der anderen Seite hilft eine konkrete Anwendung, um die Funktionen zu »stabilisieren«, jedenfalls, wenn man ggf dem L3-Team Feedback gibt.

Das mit dem Leerzeichen am Ende lässt sich leicht lösen: \tl_trim_spaces:n in einer x-Expansion. Ein Zeilenende ist nun mal im Endeffekt ein Leerzeichen.

Ich würde die Sequenz zu Beginn der Funktion leeren. (Falls die Funktion mehrmals verwendet wird.)

Um den Konventionen zu folgen wie sie in expl3.pdf Abschnitt 3.2 diskutiert werden, habe ich Deine Funktionen und Variablen dem Module cletus zugeordnet.

Open in Online-Editor
\documentclass{article}
\usepackage{expl3}
\usepackage{xparse}

% \usepackage{filecontents}
\begin{filecontents*}{Datei}
Mueller
\textbf{Meyer}
Schulze
Schmidt
machen allen Unsinn mit
\end{filecontents*}

\ExplSyntaxOn

\ior_new:N \l_cletus_datei_stream
\seq_new:N \l_cletus_dateiinhalt_seq

\cs_new:Npn \cletus_lies_dateiinhalt:n #1
  {
    \seq_clear:N \l_cletus_dateiinhalt_seq
    \ior_open:Nn \l_cletus_datei_stream {#1}
    \ior_map_inline:Nn \l_cletus_datei_stream
      { \seq_put_right:Nx \l_cletus_dateiinhalt_seq { \tl_trim_spaces:n {##1} } }
    \ior_close:N \l_cletus_datei_stream
    \seq_use:Nn \l_cletus_dateiinhalt_seq {\slash}
    % Debug-Info - wieder entfernen:
    \seq_show:N \l_cletus_dateiinhalt_seq
  }

\NewDocumentCommand \Dateiinhalt {m}
  { \cletus_lies_dateiinhalt:n {#1} }

\ExplSyntaxOff

\begin{document}
\Dateiinhalt{Datei}
\end{document}

Das log:

Open in Online-Editor
The sequence \l_cletus_dateiinhalt_seq contains the items (without outer
braces):
>  {Mueller}
>  {\textbf {Meyer}}
>  {Schulze}
>  {Schmidt}
>  {machen allen Unsinn mit}.
Permanenter link

beantwortet 28 Mai '16, 22:24

cgnieder's gravatar image

cgnieder
22.1k253463
Akzeptiert-Rate: 60%

bearbeitet 29 Mai '16, 11:19

Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×13
×5

gestellte Frage: 27 Mai '16, 23:42

Frage wurde gesehen: 7,388 Mal

zuletzt geändert: 29 Mai '16, 17:19