Como escapar de uma lista de nomes de arquivos sublinhados de forma eficiente?

Como escapar de uma lista de nomes de arquivos sublinhados de forma eficiente?

Estou pensando em como ler um arquivo CSV que possui nomes de arquivos com sublinhados de forma eficiente em uma variável LaTeX. Acho que ler as variáveis ​​brutas em uma variável inpute depois manipular itens etc. em um pgfforloop pode não ser o ideal. Estou pensando se você pode escapar dos sublinhados ao mesmo tempo ao lê-los na variável. Código

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

lista de arquivos.csv

IMG_20161215_081851.jpg,
IMG_20161215_090559.jpg,
IMG_20161215_091308.jpg

Saída com XeLaTeX

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

Pseudocódigo baseado no thread

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}

Exemplo mínimo para loop de nomes de arquivos emincludegraphics

\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
SO: Debian 8.5

Responder1

Você não precisa escapar dos sublinhados, pois \includegraphicsos aceita.

Seu principal erro está em pensar que isso \mylistse expande para uma lista de nomes de arquivos separados por vírgulas. Isso não acontece.

Você pode usar \CatchFileDef, para isso. Mas lembre-se também de não se preparar \mylistdepois \foreach.

No código abaixo removi todas /home/masi/as strings por motivos óbvios. Copiei os arquivos gráficos de exemplo usuais com os nomes em filelist.csv, para obter a saída necessária.

\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}

insira a descrição da imagem aqui

No entanto, não consigo ver o que a condicional deve fazer, porque a altura da figura sempre será no máximo .9\paperheighte nunca será igual a \paperheight.

O filelist.csvarquivo que usei é igual ao seu:

IMG_20161215_081851.jpg,
IMG_20161215_090559.jpg,
IMG_20161215_091308.jpg

Aqui está a saída lsno diretório que criei para o exemplo:

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

Responder2

O código da categoria do sublinhado pode ser alterado localmente de 8 (subscrito matemático) para 12 (categoria "outro") para eliminar o significado especial:

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

Ou

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

Os códigos de categoria são atribuídos quando a entrada é lida. Se um nome de arquivo já estiver tokenizado, os códigos de categoria não poderão ser alterados via \catcode. Se uma macro \myfilenamecontiver o nome do arquivo, ela poderá ser higienizada por:

\@onelevel@sanitize\myfilename

Ou e-TeX \detokenizepodem ser usados:

\detokenize\expandafter{\myfilename}

informação relacionada