
Я думаю, как эффективно прочитать CSV-файл, в именах файлов которого есть подчеркивания, в переменную LaTeX. Я думаю, что чтение необработанных переменных в переменную, input
а затем манипулирование элементами и т. д. в pgffor
цикле может быть неоптимальным. Я думаю, можно ли экранировать подчеркивания одновременно с чтением их в переменную. Код
\documentclass{article}
\usepackage{pgffor}
\newcommand{\mylist}{\input{/home/masi/filelist.csv}}
\begin{document}
\mylist
\end{document}
список_файлов.csv
IMG_20161215_081851.jpg,
IMG_20161215_090559.jpg,
IMG_20161215_091308.jpg
Вывод с помощью XeLaTeX
! Missing $ inserted.
<inserted text>
$
l.1 IMG_
20161215_081851.jpg,
?
)
Псевдокод на основе потока
Код
\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}
Минимальный пример для циклического перебора имен файловincludegraphics
\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
ОС: Debian 8.5
решение1
Вам не нужно экранировать подчеркивания, так как as \includegraphics
их принимает.
Ваша главная ошибка в том, что вы думаете, что это \mylist
расширяется до списка имен файлов, разделенных запятыми. Это не так.
Для этого можно использовать \CatchFileDef
,. Но также помните, что не нужно ставить скобки \mylist
после \foreach
.
В коде ниже я удалил все /home/masi/
строки по понятным причинам. Я скопировал обычные примеры графических файлов под именами в filelist.csv
, чтобы получить требуемый вывод.
\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}
Однако я не понимаю, что должно делать это условие, поскольку высота фигуры всегда будет не больше .9\paperheight
, а значит, никогда не будет равна \paperheight
.
Файл filelist.csv
, который я использовал, такой же, как и ваш:
IMG_20161215_081851.jpg,
IMG_20161215_090559.jpg,
IMG_20161215_091308.jpg
Вот вывод ls
в каталоге, который я создал для примера:
> ls
IMG_20161215_081851.jpg filelist.csv masid.pdf
IMG_20161215_090559.jpg masid.aux masid.tex
IMG_20161215_091308.jpg masid.log
решение2
Код категории подчеркивания можно локально изменить с 8 (математический нижний индекс) на 12 (категория «другое»), чтобы избавиться от специального значения:
\documentclass{article}
\usepackage{pgffor}
\newcommand{\mylist}{\input{/home/masi/filelist.csv}}
\begin{document}
\begingroup
\makeatletter
\@makeother\_%
\mylist
\endgroup
\end{document}
Или
\begingroup
\catcode`\_=12 %
\mylist
\endgroup
Коды категорий назначаются при чтении ввода. Если имя файла уже токенизировано, коды категорий не могут быть изменены через \catcode
. Если макрос \myfilename
содержит имя файла, его можно очистить с помощью:
\@onelevel@sanitize\myfilename
\detokenize
Или можно использовать e-TeX :
\detokenize\expandafter{\myfilename}