
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 input
und anschließende Manipulation von Elementen usw. in einer pgffor
Schleife 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 \includegraphics
diese akzeptiert werden.
Ihr Hauptfehler besteht in der Annahme, dass sich dies \mylist
zu einer Liste von durch Kommas getrennten Dateinamen erweitert. Dies ist nicht der Fall.
Sie können \CatchFileDef
hierfür , verwenden. Denken Sie aber auch daran, \mylist
nach 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}
Ich erkenne jedoch nicht, was der Bedingungssatz bewirken soll, da die Ziffernhöhe immer höchstens .9\paperheight
und somit nie gleich sein wird \paperheight
.
Die filelist.csv
Datei, 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 ls
in 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 \myfilename
den Dateinamen enthält, kann er folgendermaßen bereinigt werden:
\@onelevel@sanitize\myfilename
Oder es können e-TeXs \detokenize
verwendet werden:
\detokenize\expandafter{\myfilename}