我正在考虑如何将文件名带下划线的 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
您不需要转义下划线,因为它\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}