
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 input
e depois manipular itens etc. em um pgffor
loop 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 \includegraphics
os aceita.
Seu principal erro está em pensar que isso \mylist
se 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 \mylist
depois \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}
No entanto, não consigo ver o que a condicional deve fazer, porque a altura da figura sempre será no máximo .9\paperheight
e nunca será igual a \paperheight
.
O filelist.csv
arquivo que usei é igual ao seu:
IMG_20161215_081851.jpg,
IMG_20161215_090559.jpg,
IMG_20161215_091308.jpg
Aqui está a saída ls
no 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 \myfilename
contiver o nome do arquivo, ela poderá ser higienizada por:
\@onelevel@sanitize\myfilename
Ou e-TeX \detokenize
podem ser usados:
\detokenize\expandafter{\myfilename}