밑줄이 그어진 파일 이름 목록을 효율적으로 이스케이프하는 방법은 무엇입니까?

밑줄이 그어진 파일 이름 목록을 효율적으로 이스케이프하는 방법은 무엇입니까?

LaTeX 변수에 밑줄이 있는 파일 이름이 있는 CSV 파일을 효율적으로 읽는 방법을 생각 중입니다. 나는 원시 변수를 변수로 읽은 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: 데비안 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}

관련 정보