
Estoy pensando en cómo leer un archivo CSV que tiene nombres de archivos con guiones bajos de manera eficiente en una variable LaTeX. Creo que leer las variables sin procesar en una variable input
y luego manipular elementos, etc. en un pgffor
bucle puede no ser óptimo. Estoy pensando si puedes escapar de los guiones bajos al mismo tiempo que los lees en la variable. Código
\documentclass{article}
\usepackage{pgffor}
\newcommand{\mylist}{\input{/home/masi/filelist.csv}}
\begin{document}
\mylist
\end{document}
lista de archivos.csv
IMG_20161215_081851.jpg,
IMG_20161215_090559.jpg,
IMG_20161215_091308.jpg
Salida con XeLaTeX
! Missing $ inserted.
<inserted text>
$
l.1 IMG_
20161215_081851.jpg,
?
)
Pseudocódigo basado en el hilo.
Código
\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}
Ejemplo mínimo para bucles de nombres de archivos enincludegraphics
\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:
SO 2016: Debian 8.5
Respuesta1
No es necesario evitar los guiones bajos, ya que \includegraphics
los acepta.
Su principal error es pensar que \mylist
se expande a una lista de nombres de archivos separados por comas. No es así.
Puedes usar \CatchFileDef
, para eso. Pero recuerde también no ponerse tenso \mylist
después \foreach
.
En el código siguiente eliminé todas /home/masi/
las cadenas por razones obvias. Copié los archivos gráficos de ejemplo habituales bajo los nombres en filelist.csv
, para obtener el resultado requerido.
\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}
Sin embargo, no veo qué se supone que debe hacer el condicional, porque la altura de la figura siempre será como máximo .9\paperheight
y, por lo tanto, nunca será igual a \paperheight
.
El filelist.csv
archivo que utilicé es el mismo que el tuyo:
IMG_20161215_081851.jpg,
IMG_20161215_090559.jpg,
IMG_20161215_091308.jpg
Aquí está el resultado ls
en el directorio que creé para el ejemplo:
> ls
IMG_20161215_081851.jpg filelist.csv masid.pdf
IMG_20161215_090559.jpg masid.aux masid.tex
IMG_20161215_091308.jpg masid.log
Respuesta2
El código de categoría del guión bajo se puede cambiar localmente de 8 (subíndice matemático) a 12 (categoría "otro") para eliminar el significado especial:
\documentclass{article}
\usepackage{pgffor}
\newcommand{\mylist}{\input{/home/masi/filelist.csv}}
\begin{document}
\begingroup
\makeatletter
\@makeother\_%
\mylist
\endgroup
\end{document}
O
\begingroup
\catcode`\_=12 %
\mylist
\endgroup
Los códigos de categoría se asignan cuando se lee la entrada. Si un nombre de archivo ya está tokenizado, los códigos de categoría no se pueden cambiar mediante \catcode
. Si una macro \myfilename
contiene el nombre del archivo, se puede desinfectar mediante:
\@onelevel@sanitize\myfilename
\detokenize
O se pueden utilizar e-TeX :
\detokenize\expandafter{\myfilename}