Как эффективно экранировать список подчеркнутых имен файлов?

Как эффективно экранировать список подчеркнутых имен файлов?

Я думаю, как эффективно прочитать 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}

Связанный контент