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