¿Cómo escapar de una lista de nombres de archivos subrayados de manera eficiente?

¿Cómo escapar de una lista de nombres de archivos subrayados de manera eficiente?

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 inputy luego manipular elementos, etc. en un pgfforbucle 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 \includegraphicslos acepta.

Su principal error es pensar que \mylistse 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 \mylistdespué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}

ingrese la descripción de la imagen aquí

Sin embargo, no veo qué se supone que debe hacer el condicional, porque la altura de la figura siempre será como máximo .9\paperheighty, por lo tanto, nunca será igual a \paperheight.

El filelist.csvarchivo que utilicé es el mismo que el tuyo:

IMG_20161215_081851.jpg,
IMG_20161215_090559.jpg,
IMG_20161215_091308.jpg

Aquí está el resultado lsen 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 \myfilenamecontiene el nombre del archivo, se puede desinfectar mediante:

\@onelevel@sanitize\myfilename

\detokenizeO se pueden utilizar e-TeX :

\detokenize\expandafter{\myfilename}

información relacionada