我有一个外部文本文件,其中包含 TeX 输入文件的名称列表。名称带有尾随扩展名.tex
。例如,名为的外部文本文件data.txt
包含以下列表:
a.tex
b.tex
c.tex
每个 TeX 输入文件在现有的同一目录中都有一个 PDF 文件data.txt
。
以下代码预期迭代不带扩展名的文件名并导入相应的PDF。
\documentclass{article}
\usepackage{graphicx}
\begin{document}
\newread\reader
\immediate\openin\reader=data.txt\relax
\loop
\read\reader to \x
\unless\ifeof\reader
\includegraphics{\x}\par
\repeat
\immediate\closein\reader
\end{document}
您能帮我实现修剪宏来删除.tex
吗\x
?
答案1
内核LaTeX2e
提供了一些用于解析路径和扩展名的命令。最好使用它们进行此类解析。
宏\filename@parse
扫描其参数并将其分成三部分,然后保存在宏\filename@area
、、\filename@base
中\filename@ext
\documentclass{article}
\begin{document}
\makeatletter
\filename@parse{path/name.tex}
\filename@area, \filename@base, \filename@ext
\makeatother
\end{document}
在您的情况下\filename@base
将表示修剪的文件名,没有路径或扩展名信息。
答案2
正如 Yiannis Lazarides 所说,\filename@parse
可以使用内部 LaTeX2e 宏来解析文件名。但是,用于分离扩展名的代码假设文件名中只有一个点,并且其后的所有内容都是文件扩展名。因此,对于包含多个点的文件名,您将得到不正确的结果,如下所示。
我最近通过重新实现部分内部功能,为我的包添加了对多点文件名的支持currfile
(显示当前文件名、路径、扩展名等)\filename@parse
。遗憾的是,没有公共接口,但您可以按如下方式使用它:
\documentclass{article}
\usepackage{currfile}[2011/09/18]
\begin{document}
\makeatletter
\filename@parse{path/name.tex}
\filename@area, \filename@base, \filename@ext
% Will take 'width.dots.tex' as the extension
\filename@parse{path/name.with.dots.tex}
\filename@area, \filename@base, \filename@ext
% Works with internal 'currfile' redefinitions:
{
\let\filename@simple\currfile@parseext
\let\filename@base\@gobble
\filename@parse{path/name.with.dots.tex}
\filename@area, \filename@base, \filename@ext
}
\makeatother
\end{document}
答案3
这是一个可能的定义,其中还可以说明每个图形文件的选项
\documentclass{article}
\usepackage{graphicx}
\makeatletter
\newread\inclfromfile@read
\newcommand\includefromfile[2][]{%
\openin\inclfromfile@read#2\relax
\loop\read\inclfromfile@read to \@tempa
\unless\ifeof\inclfromfile@read
\filename@parse{\@tempa}%
\begingroup\edef\x{\endgroup
\noexpand\includegraphics[#1]{\filename@base}\noexpand\par}\x
\repeat
\closein\inclfromfile@read
}
\makeatother
\begin{document}
\begin{center}
\includefromfile[scale=1.2]{data.txt}
\end{center}
\end{document}
请注意,在和\immediate
之前不执行任何操作(它与和不同,在没有和的情况下, 命令将在涉及它们的下一个操作期间执行)。\openin
\closein
\openout
\closeout
\immediate
\shipout
重要的是要说\noexpand\par
,在某些环境(尤其是center
)中,\par
被重新定义为宏。