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