如何有效地轉義帶下劃線的檔案名稱清單?

如何有效地轉義帶下劃線的檔案名稱清單?

我正在考慮如何將具有下劃線的檔案名稱的 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}

相關內容