如何有效地转义带下划线的文件名列表?

如何有效地转义带下划线的文件名列表?

我正在考虑如何将文件名带下划线的 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}

相关内容