Wie kann man effizient aus einer Liste unterstrichener Dateinamen entkommen?

Wie kann man effizient aus einer Liste unterstrichener Dateinamen entkommen?

Ich überlege, wie man eine CSV-Datei, deren Dateinamen Unterstriche enthalten, effizient in eine LaTeX-Variable einliest. Ich denke, das Einlesen der Rohvariablen in eine Variable inputund anschließende Manipulation von Elementen usw. in einer pgfforSchleife ist möglicherweise nicht optimal. Ich überlege, ob man die Unterstriche gleichzeitig maskieren kann, wenn man sie in die Variable einliest. Code

\documentclass{article}
\usepackage{pgffor}
\newcommand{\mylist}{\input{/home/masi/filelist.csv}}
\begin{document}
\mylist
\end{document}

Dateiliste.csv

IMG_20161215_081851.jpg,
IMG_20161215_090559.jpg,
IMG_20161215_091308.jpg

Ausgabe mit XeLaTeX

! Missing $ inserted.
<inserted text> 
                $
l.1 IMG_
        20161215_081851.jpg,
? 
)

Pseudocode basierend auf dem Thread

Code

\documentclass{article}
\usepackage{pgffor}

% TODO here apply escape on a list; what is the good way here?     
% http://tex.stackexchange.com/q/58689/13173

\immediate\openout\tempfile="name\string_01.txt"

\newcommand{\mylist}{\input{/home/masi/filelist.csv}}

\begin{document}
\mylist
\end{document}

Minimales Beispiel für die Schleife von Dateinamen inincludegraphics

\documentclass{article}
\usepackage{pgffor}
\usepackage{graphicx} % for importing .pdf images     
\newsavebox{\imgbox}

\newcommand{\mylist}{\input{/home/masi/filelist.csv}}

\begin{document}

% http://tex.stackexchange.com/a/341553/13173
\centering
\foreach \ii in {\mylist} {
  \IfFileExists{/home/masi/\ii}{
    \begin{figure}
    \centering
    \savebox{\imgbox}{% Store image in a box
      \includegraphics[height=.9\paperheight,width=\linewidth,keepaspectratio]{/home/masi/\ii}
    }%
    \ifdim\ht\imgbox = \paperheight
      \resizebox{\linewidth}{!}{\rotatebox{90}{\includegraphics{/home/masi/\ii}}
    }%
    \else
      \usebox{\imgbox}%
    \fi
    \caption{Case}
    \end{figure}
  }{}
} % closing brace for loop

\end{document}

TeXLive: 2016
Betriebssystem: Debian 8.5

Antwort1

Sie müssen Unterstriche nicht maskieren, da \includegraphicsdiese akzeptiert werden.

Ihr Hauptfehler besteht in der Annahme, dass sich dies \mylistzu einer Liste von durch Kommas getrennten Dateinamen erweitert. Dies ist nicht der Fall.

Sie können \CatchFileDefhierfür , verwenden. Denken Sie aber auch daran, \mylistnach keine Klammer zu verwenden \foreach.

Im folgenden Code habe ich /home/masi/aus offensichtlichen Gründen alle Zeichenfolgen entfernt. Ich habe die üblichen Beispielgrafikdateien unter den Namen in kopiert filelist.csv, um die erforderliche Ausgabe zu erhalten.

\documentclass{article}
\usepackage{pgffor}
\usepackage{graphicx} % for importing .pdf images
\usepackage{catchfile}

\newsavebox{\imgbox}
\CatchFileDef{\mylist}{filelist.csv}{\endlinechar=-1 }

\begin{document}

\foreach \ii in \mylist {
  \IfFileExists{\ii}{
    \begin{figure}
    \centering
    \savebox{\imgbox}{% Store image in a box
      \includegraphics[height=.9\paperheight,width=\linewidth,keepaspectratio]{\ii}
    }%
    \ifdim\ht\imgbox = \paperheight
      \resizebox{\linewidth}{!}{\rotatebox{90}{\includegraphics{\ii}}
    }%
    \else
      \usebox{\imgbox}%
    \fi
    \caption{Case}
    \end{figure}
  }{}
} % closing brace for loop

\end{document}

Bildbeschreibung hier eingeben

Ich erkenne jedoch nicht, was der Bedingungssatz bewirken soll, da die Ziffernhöhe immer höchstens .9\paperheightund somit nie gleich sein wird \paperheight.

Die filelist.csvDatei, die ich verwendet habe, ist die gleiche wie Ihre:

IMG_20161215_081851.jpg,
IMG_20161215_090559.jpg,
IMG_20161215_091308.jpg

Hier ist die Ausgabe lsin dem Verzeichnis, das ich für das Beispiel erstellt habe:

> ls
IMG_20161215_081851.jpg     filelist.csv        masid.pdf
IMG_20161215_090559.jpg     masid.aux           masid.tex
IMG_20161215_091308.jpg     masid.log

Antwort2

Der Kategoriencode des Unterstrichs kann lokal von 8 (mathematischer Index) auf 12 (Kategorie „andere“) geändert werden, um die spezielle Bedeutung loszuwerden:

\documentclass{article}
\usepackage{pgffor}
\newcommand{\mylist}{\input{/home/masi/filelist.csv}}
\begin{document}
\begingroup
  \makeatletter
  \@makeother\_%
  \mylist
\endgroup
\end{document}

Oder

\begingroup
  \catcode`\_=12 %
  \mylist
\endgroup

Kategoriecodes werden zugewiesen, wenn die Eingabe gelesen wird. Wenn ein Dateiname bereits tokenisiert ist, können die Kategoriecodes nicht über geändert werden \catcode. Wenn ein Makro \myfilenameden Dateinamen enthält, kann er folgendermaßen bereinigt werden:

\@onelevel@sanitize\myfilename

Oder es können e-TeXs \detokenizeverwendet werden:

\detokenize\expandafter{\myfilename}

verwandte Informationen