アンダースコア付きファイル名のリストを効率的にエスケープするにはどうすればよいでしょうか?

アンダースコア付きファイル名のリストを効率的にエスケープするにはどうすればよいでしょうか?

アンダースコアを含むファイル名を持つ 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
OS: Debian 8.5

答え1

アンダースコアは受け入れられるので、エスケープする必要はありません\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

または、e-TeX を\detokenize使用することもできます。

\detokenize\expandafter{\myfilename}

関連情報